java - What's causing my stackoverflowerror in my maze solver? -
i have solve maze using recursion , going fine until ran program , ran stackoverflowerror. i've read couple other questions on site , it's because of infinite recursion none of issues seem exact same mine.
my netid_maze.java file
import java.util.random; public class netid_maze { int exitrow, entrancerow; char[][] map = null; // method name : maze (constructor) // parameters : none // partners : none // description : no parameter constructor maze public netid_maze() { // omitted code generating random maze setentrancerow(rnger.nextint(row - 2) + 1); setexitrow(rnger.nextint(row - 2) + 1); map[getentrancerow()][0] = '.'; map[getexitrow()][column - 1] = '.'; } // end netid_maze (without parameters) // method name : maze (constructor) // parameters : exittemp (int), entrancetemp(int), maptemp (char[][]) // partners : none // description : parameter constructor maze public netid_maze(char[][] maptemp, int exittemp, int entrancetemp) { map = maptemp; exitrow = exittemp; entrancerow = entrancetemp; } // end netid_maze (with parameters) // method name : getcell // parameters : row (int), column (int), character in cell (character) // partners : none // returns : character in cell that's being called (character) // description : returns character of cell that's being called public char getcell(int r, int c) { return map[r][c]; } // end getcell() // method name : setcell // parameters : row (int), column (int), character in cell (character) // partners : none // returns : none // description : changes character of cell that's being called public void setcell(int r, int c, char val) { this.map[r][c] = val; } // end setcell() public int getentrancerow () { return entrancerow; } public int getexitrow() { return exitrow; } public void setentrancerow(int entrancetemp) { entrancerow = entrancetemp; } public void setexitrow(int exittemp) { exitrow = exittemp; } public int getrows() { return map.length; } public int getcolumns() { return map[1].length; } public boolean isexit(int r, int c) { boolean isexit = false; if (getexitrow() == r && map[1].length - 1 == c) { isexit = true; } return isexit; } public boolean isentrance(int r, int c) { boolean isentrance = false; if (getentrancerow() == r && 0 == c) { isentrance = true; } return isentrance; } public boolean isopen(int r, int c) { boolean isopen = true; if (r < 0 || c < 0 || r >= getrows() || c >= getcolumns()) { isopen = false; } else if (map[r][c] == '.') { isopen = false; } return isopen; } }
and netid_mazesolver.java file
public class netid_mazesolver { int steps = 0; netid_maze maze = new netid_maze(); public netid_mazesolver(netid_maze mazetemp) { setsteps(0); maze = mazetemp; } public boolean solvemaze(int r, int c) { //finding whether current cell outside maze if (r < 0 || c < 0 || r >= maze.getrows() || c >= maze.getcolumns()) { return false; } //finding whether current cell exit if (maze.isexit(r,c) == true) { return true; } //finding whether current cell not open if (maze.isopen(r,c) == false) { return false; } //setting current cell part of solution path //finding out whether solve maze(cell below current) == true if (solvemaze(r - 1,c) == true) { return true; } //finding out whether solve maze(cell right of current) == true if (solvemaze(r,c + 1) == true) { return true; } //finding out whether solve maze(cell left of current) == true if (solvemaze(r,c - 1) == true) { return true; } //finding out whether solve maze(cell above current) == true if (solvemaze(r + 1,c) == true) { return true; } //setting current cell not part of solution path return false; } public void setsteps(int stepstemp) { steps = stepstemp; } public int getsteps() { return steps; } }
the actual error keeps repeating: @ netid_mazesolver.solvemaze(netid_mazesolver.java:53) @ netid_mazesolver.solvemaze(netid_mazesolver.java:71)
the basic mistake made, don't set flags visited cells. due this, algorithm can visit same cell again , again. if generated maze contains cycles, you're pretty end in endlessloop causing stackoverflow. , btw, don't need, write if(maze.isopen(r , c) == true)
. if(maze.isopen(r , c))
gives same result less code.
Comments
Post a Comment