2015-04-17 122 views
0

我有这个任务,我应该在Java中创建一个迷宫求解器。我决定应用的算法按以下方式工作:它是一种递归方法,在每次找到路径时再次调用自身。如果它运行到死胡同,它会调用第二个递归方法“goBack”,它会一直返回,直到它找到一个新路径。墙是0,路径是1,走路是2,走过两次的路径是3s。这个想法很简单,但我无法实现。 ArrayOutOfBounds异常一直显示。有人对此有任何想法吗?Java递归迷宫

public class Project5v2 { 

static String mazecsv = "/Users/amorimph/Documents/COMP 182/Project 5/mazeinput.csv"; 
static File solvedMaze = new File("/Users/amorimph/Documents/COMP 182/Project 5/solvedMaze.txt"); 
static int[][] maze = new int[50][50]; 
static int trigger = 0; 
static int mazeWidth; 
static int mazeHeight; 

public static void main(String[] args) { 

    readCSV(mazecsv); 
    start(maze); 
    mazeToString(maze); 

} 

public static void readCSV(String csvfile) { 

    BufferedReader br = null; 
    String line = ""; 
    String csvSplitBy = ","; 
    int x = 1; 
    int y = 0; 


    try { 

     br = new BufferedReader(new FileReader(csvfile)); 
     br.readLine(); 

      while ((line = br.readLine()) != null) { 

       String[] info = line.split(csvSplitBy); 

       for (x = 1; x < info.length; x++) {      
         maze[y][x] = Integer.parseInt(info[x]); 
       } 
       mazeWidth = info.length; 
       y++; 
       mazeHeight = y; 

      } 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

public static void start(int[][] maze) { 

int i = 0; 
while(maze[0][i] != 1) { 
    i++; 
} 
System.out.println(i); 
move(maze,i,1); 

} 

public static void move(int[][] maze, int x, int y) { 


for (int i = 0; i < 4; i++) { 
    switch(i) { 

    case 0: if(maze[x][y-1] == 1) { 
     maze[x][y] = 2; 
     maze[x][y-1] = 2; 
     move(maze, x, y-1); 
     break; 
    } 

    case 1: if(maze[x-1][y] == 1) { 
     maze[x][y] = 2; 
     maze[x-1][y] = 2; 
     move(maze, x-1, y); 
     break; 
    } 

    case 2: if(maze[x+1][y] == 1) { 
     maze[x][y] = 2; 
     maze[x+1][y] = 2; 
     move(maze, x+1, y); 
     break; 
    } 

    case 3: if(maze[x][y+1] == 1) { 
     maze[x][y] = 2; 
     maze[x][y+1] = 2; 
     move(maze, x, y+1); 
     break; 
    } 

    //case 4: 
    // maze[x][y] = 2; 
    // goBack(maze, y, x); 
    // break; 

    } 
} 
} 

public static void goBack(int[][] maze, int x, int y) { 

for (int i = 0; i < 7; i++) { 
    switch(i) { 

    case 0: if(maze[x][y-1] == 1) { 
     maze[x][y] = 2; 
     maze[x][y-1] = 2; 
     move(maze, x, y-1); 
     break; 
    } 

    case 1: if(maze[x-1][y] == 1) { 
     maze[x][y] = 2; 
     maze[x-1][y] = 2; 
     move(maze, x-1, y); 
     break; 
    } 

    case 2: if(maze[x+1][y] == 1) { 
     maze[x][y] = 2; 
     maze[x+1][y] = 2; 
     move(maze, x+1, y); 
     break; 
    } 

    case 3: if(maze[x][y+1] == 1) { 
     maze[x][y] = 2; 
     maze[x][y+1] = 2; 
     move(maze, x, y+1); 
     break; 
    } 

    case 4: if(maze[x][y+1] == 2) { 
     maze[x][y] = 3; 
     goBack(maze, x, y+1); 
     break; 
    } 

    case 5: if(maze[x+1][y] == 2) { 
     maze[x][y] = 3; 
     goBack(maze, x+1, y); 
     break; 
    } 

    case 6: if(maze[x-1][y] == 2) { 
     maze[x][y] = 3; 
     goBack(maze, x-1, y); 
     break; 
    } 

    case 7: if(maze[x][y-1] == 2) { 
     maze[x][y] = 3; 
     goBack(maze, x, y-1); 
     break; 
    } 
    } 
} 
} 

public static void FWriter(String content, File file) { 

try {   
     if (!file.exists()) { 
     file.createNewFile(); 
     }  
     FileWriter fw = new FileWriter(file.getAbsoluteFile(), true); 
     BufferedWriter bw = new BufferedWriter(fw); 
     bw.write(content); 
     bw.close();   
}   
catch (IOException e) { 
     e.printStackTrace(); 
} 
} 

public static void mazeToString(int[][] maze) { 

    for(int i = 0; i < mazeHeight; i++) { 
     for(int j = 0; j < mazeWidth; j++) { 
      FWriter(Integer.toString(maze[i][j]), solvedMaze); 
     } 
     FWriter("\n", solvedMaze); 
    } 
} 

} 
+0

我知道迷宫是由我们的边界的正方形组成的,如果边界是有颜色的,那么它是一堵墙,不能被穿过? – Alexey

回答

2

你的迷宫是50 * 50。看看你的移动方法,我看不到任何东西阻止你从迷宫中走出(即移动到大于49或小于0的索引)。

更一般地说,如果你想使用递归,并且你不想陷入麻烦,你必须检查你什么时候完成。你的移动方法永远不会停止调用自己,所以想想移动方法应该终止的地方。