用一个二维数组表示迷宫,0表示通路,1表示围墙,给定入口和出口,寻找所有可能的通路。例如:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
该迷宫较为简单,可看出有四条通路。可以利用递归的算法来找出所有通路。从入口开始作为当前节点,判断其上下左右四个节点是否可以通过,可以则选取其中一个作为当前节点并标记为已访问,重复该步骤,用2标记通路,直至到达出口,打印该方案。实现代码如下:
import java.util.*;
public class Maze {
//初始化迷宫矩阵
public static int[][] maze =
{
{1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,1,1,1,1,1,1,1,1},
{1,1,1,0,1,1,0,0,0,0,1,1},
{1,1,1,0,1,1,0,1,1,0,1,1},
{1,1,1,0,0,0,0,1,1,0,1,1},
{1,1,1,0,1,1,0,1,1,0,1,1},
{1,1,1,0,0,0,0,1,1,0,1,1},
{1,1,1,1,1,1,0,1,1,0,1,1},
{1,1,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1}
};
public static int bx = 1, by = 1, ex = 8, ey = 10;//入口、出口的行列下标
public static int count = 0;//记录方案的个数
public static int[][] state = new int[maze.length][maze[0].length];//记录节点是否被访问,0表示未,1表示已
public static void main(String[] args){
for(int i=0; i<state.length; i++){Arrays.fill(state[i],0);}
maze[bx][by] = 2;
move(bx,by);
}
public static void move(int i, int j){
maze[i][j] = 2;//用2标记该节点,表示选择该节点作为路径节点之一
state[i][j] = 1;//用1表示该节点已被访问,避免出现环路
if(i==ex&&j==ey){
count++;
System.out.println("方案"+count+":");
for(int k=0;k<maze.length;k++){//打印方案
for(int l=0;l<maze[k].length;l++){
System.out.print(maze[k][l]+" ");
}
System.out.println();
}
}
else{//判断上下左右可通节点
if(maze[i][j+1]==0&&state[i][j+1]==0){
move(i,j+1);
}
if(maze[i+1][j]==0&&state[i+1][j]==0){
move(i+1,j);
}
if(maze[i-1][j]==0&&state[i-1][j]==0){
move(i-1,j);
}
if(maze[i][j-1]==0&&state[i][j-1]==0){
move(i,j-1);
}
}
maze[i][j] = 0;
state[i][j] = 0;
}
}
输出:
方案1:
1 1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 1 1 1 1 1 1 1 1
1 1 1 2 1 1 0 0 0 0 1 1
1 1 1 2 1 1 0 1 1 0 1 1
1 1 1 2 2 2 2 1 1 0 1 1
1 1 1 0 1 1 2 1 1 0 1 1
1 1 1 0 0 0 2 1 1 0 1 1
1 1 1 1 1 1 2 1 1 0 1 1
1 1 0 0 0 0 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1
方案2:
1 1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 1 1 1 1 1 1 1 1
1 1 1 2 1 1 2 2 2 2 1 1
1 1 1 2 1 1 2 1 1 2 1 1
1 1 1 2 2 2 2 1 1 2 1 1
1 1 1 0 1 1 0 1 1 2 1 1
1 1 1 0 0 0 0 1 1 2 1 1
1 1 1 1 1 1 0 1 1 2 1 1
1 1 0 0 0 0 0 0 0 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1
方案3:
1 1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 1 1 1 1 1 1 1 1
1 1 1 2 1 1 0 0 0 0 1 1
1 1 1 2 1 1 0 1 1 0 1 1
1 1 1 2 0 0 0 1 1 0 1 1
1 1 1 2 1 1 0 1 1 0 1 1
1 1 1 2 2 2 2 1 1 0 1 1
1 1 1 1 1 1 2 1 1 0 1 1
1 1 0 0 0 0 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1
方案4:
1 1 1 1 1 1 1 1 1 1 1 1
1 2 2 2 1 1 1 1 1 1 1 1
1 1 1 2 1 1 2 2 2 2 1 1
1 1 1 2 1 1 2 1 1 2 1 1
1 1 1 2 0 0 2 1 1 2 1 1
1 1 1 2 1 1 2 1 1 2 1 1
1 1 1 2 2 2 2 1 1 2 1 1
1 1 1 1 1 1 0 1 1 2 1 1
1 1 0 0 0 0 0 0 0 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1