`Recibí un error de desbordamiento de pila al usar este código. quiero que funcione si ya encontramos la ruta más corta, entonces el código recursivo se detendrá. el laberinto contiene el carácter '#' y ' '. y si encuentro el camino más corto, el camino se marcará con '.' por favor ayuda gracias
public static int getCoordinateY(String location){ //to get x coordinate String y = location.substring(2, 4); int coor = (y.charAt(0) - 'Q') * 10 + Character.getNumericValue(y.charAt(1));`enter code here` return coor; } public boolean canPass(int y,int x) { //you can keep going if you not found # and . if(map[y][x] == '#' || map[y][x] == '.' ) { return false; } return true; } public Character[][] cloneArray(Character[][] src) { //copy array int length = src.length; Character[][] target = new Character[length][src[0].length]; for (int i = 0; i < length; i++) { System.arraycopy(src[i], 0, target[i], 0, src[i].length); } return target; } public void finish(int x,int y){ //goal xgoal=x; ygoal=y; } public int getDistance(){ //shortest distance from shortest path return finalDistance; } public void shortestPathStart(int xStart,int yStart, int xEnd, int yEnd){ set('S',xStart,yStart); //start coordinate finish(xEnd,yEnd); shortestPathRec(xStart+1,yStart,0,map);//to right shortestPathRec(xStart-1,yStart,0,map);// to left shortestPathRec(xStart,yStart+1,0,map);//to up shortestPathRec(xStart,yStart-1,0,map);// to down map = result; //final map with '.' set('F',xEnd,yEnd); print(); } public void shortestPathRec(int x,int y,int step,Character[][] map){ if(canPass(x,y)){ step++; Character[][] temp = cloneArray(map); temp[x][y] = '.'; //in the maze, '.' using for flags if(x == xgoal && y == ygoal){//if already found the goal hasDone = true; finalDistance = step; result = temp; return; } if(hasDone==true && finalDistance<step){ //if shortest path is found other path should be in this condition return; } shortestPathRec(x+1,y,step,temp);//calltherecursive again shortestPathRec(x-1,y,step,temp); shortestPathRec(x,y+1,step,temp); shortestPathRec(x,y-1,step,temp); } }ANÁLISIS DEL PROBLEMA
No se protege contra el retroceso físico: se mueve hacia una pared, pero en lugar de retroceder en su pila de llamadas (deshacer el último movimiento), va a la siguiente llamada recursiva y hace el movimiento opuesto , dando un segundo paso inútil en su lugar. de retroceder hasta 0 pasos inútiles. Su código caminará infinitamente entre esos dos cuadrados hasta que exceda el límite de pila.
REPARAR
Madifique su código para que nunca camine a una plaza que ya ha visitado en este camino. Esto es bastante fácil de investigar en línea; El algoritmo de Dijkstra es una de las primeras soluciones generales.
EVITACIÓN
Aprenda la depuración básica. Entre otras cosas, inserte sentencias de impresión a la entrada y salida de cada rutina, imprimiendo los parámetros de entrada y los valores de retorno. Para mayor claridad, mantenga un contador de profundidad y sangre las impresiones adecuadamente.