首页 文章

Java递归迷宫[重复]

提问于
浏览
0

这个问题在这里已有答案:

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

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);
    }
}

}

1 回答

  • 2

    你的迷宫是50 * 50 .

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

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

相关问题