給定 M×N 矩陣迷宮,0 表示通路,1 表示牆壁。從左上角 (0,0) 走到右下角 (M-1,N-1),只能上下左右移動,求所有可行路徑。本文提供標準回溯模板,並以 9×8 迷宮為例輸出 8 條路徑。
int[][] maze 存儲迷宮,5 標記已走路徑;canMove 校驗:越界、牆壁、已訪問均不可行;maze[i][j] = 0);public class MazeSolver {
private final int[][] maze = {
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,0,1,0},
{0,0,1,0,1,1,0,1},
{0,1,1,1,0,0,1,0},
{0,0,0,1,0,0,0,0},
{0,1,0,0,0,1,0,1},
{0,1,1,1,1,0,0,1},
{1,1,0,0,0,1,0,1},
{1,1,0,0,0,0,0,0}
};
private final int ROWS = 9, COLS = 8;
public static void main(String[] args) {
long start = System.currentTimeMillis();
new MazeSolver().dfs(0, 0);
System.out.println("耗時: " + (System.currentTimeMillis() - start) + "ms");
}
private void dfs(int r, int c) {
if (r == ROWS - 1 && c == COLS - 1) {
printPath();
return;
}
// 四個方向:右、左、下、上
int[][] dirs = {{0,1},{0,-1},{1,0},{-1,0}};
for (int[] d : dirs) {
int nr = r + d[0], nc = c + d[1];
if (canMove(nr, nc)) {
maze[r][c] = 5; // 標記
dfs(nr, nc);
maze[r][c] = 0; // 回溯恢復
}
}
}
private boolean canMove(int r, int c) {
if (r < 0 || c < 0 || r >= ROWS || c >= COLS) return false;
if (maze[r][c] == 1 || maze[r][c] == 5) return false;
return true;
}
private void printPath() {
System.out.println("得到一個解:");
for (int[] row : maze) {
for (int v : row) System.out.print(v + " ");
System.out.println();
}
}
}
5 代表路徑,直觀展示走法;