Pour la partie 1 , j'ai appliqué un bête parcours en profondeur.
Pour la partie 2, j'ai laissé tourner ma solution de partie 1 pour trouver la max de la partie 2.
Environ 1h de calcul.
J'aurai bien essayé de faire un truc plus intelligent mais je n'avais pas le temps.
Il faut quand même lancer ce code -Xss1g pour avoir une stack conséquence qui permet une récursivité aussi profonde.
packageaoc2023;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassAoc2023s23{publicstaticPoint[]DIRECTIONS=newPoint[]{newPoint(1,0),newPoint(-1,0),newPoint(0,-1),newPoint(0,1)};publicrecordPoint(intx,inty){}publicstaticclassPath{boolean[][]walked;int[]pathX;int[]pathY;intstep=-1;publicPath(Worldworld){walked=newboolean[world.height][world.width];this.pathX=newint[world.width*world.height];this.pathY=newint[world.width*world.height];}publicvoidmove(intx,inty){walked[y][x]=true;step++;this.pathX[step]=x;this.pathY[step]=y;}publicvoidback(){if(step>=0){intx=getX();inty=getY();walked[y][x]=false;}step--;}privateintgetY(){returnthis.pathY[step];}privateintgetX(){returnthis.pathX[step];}}publicstaticclassWorld{List<String>rows;intwidth;intheight;intendx;intendy;intmaxPath=0;publicWorld(List<String>rows){this.rows=rows;this.height=rows.size();this.width=rows.get(0).length();this.endx=width-2;this.endy=height-1;}publicfinalcharcell(intx,inty){returnrows.get(y).charAt(x);}publicbooleancanWalkFrom(intsx,intsy,intdx,intdy){if(dx<0||dx>=width||dy<0||dy>=height){returnfalse;}chardest=cell(dx,dy);if(dest=='#'){returnfalse;}charstart=cell(sx,sy);returntrue;/* if (start == '.') { return true; } else if (start == '>') { return dx > sx; } else if (start == '<') { return dx < sx; } else if (start == '^') { return dy < sy; } else if (start == 'v') { return dy > sy; } throw new RuntimeException("Unsupported " + start); */}publicvoidexplore(Pathpath){intsx=path.getX();intsy=path.getY();if(sx==endx&&sy==endy){System.out.println("Size:"+path.step);if(path.step>maxPath){maxPath=path.step;}return;}for(inti=0;i<DIRECTIONS.length;i++){Pointp=DIRECTIONS[i];intdx=sx+p.x;intdy=sy+p.y;if(canWalkFrom(sx,sy,dx,dy)&&!path.walked[dy][dx]){path.move(dx,dy);explore(path);path.back();}}}}publicstaticvoidmain(String[]args){try(Scannerin=newScanner(Aoc2023s23.class.getResourceAsStream("res/t23.txt"))){List<String>rows=newArrayList<>();while(in.hasNext()){Stringrow=in.nextLine();rows.add(row);}Worldworld=newWorld(rows);Pathpath=newPath(world);path.move(1,0);world.explore(path);System.out.println("max="+world.maxPath);}}}
# Brut force pour la partie 2
Posté par syj . En réponse au message Advent of Code 2023, jour 23. Évalué à 1.
Pour la partie 1 , j'ai appliqué un bête parcours en profondeur.
Pour la partie 2, j'ai laissé tourner ma solution de partie 1 pour trouver la max de la partie 2.
Environ 1h de calcul.
J'aurai bien essayé de faire un truc plus intelligent mais je n'avais pas le temps.
Il faut quand même lancer ce code -Xss1g pour avoir une stack conséquence qui permet une récursivité aussi profonde.