public static void main(String [] args)
{
//先创建一个二位数组模拟迷宫
//地图
int [][] map=new int[8][7];
//使用1表示墙
//上下全部置为1
for(int i=0;i<7;i++)
{
map[0][i]=1;
map[7][i]=1;
}
//左右置为1
for(int j=0;j<8;j++)
{
map[j][0]=1;
map[j][6]=1;
}
//设置挡板
map[3][1]=1;
map[3][2]=1;
//使用递归给小球找路
System.out.println( setWay2(map,1,1));
//输出地图
for(int i=0;i<8;i++)
{
for(int j=0;j<7;j++)
{
System.out.print(map[i][j]+" ");
}
System.out.print("\n");
}
}
//使用递归回溯来找路
//1.map表示地图
//2.i j表示从地图的哪个位置开始出发
//3.如果小球能到map[6][5]则说明通路
//4.0表示没有走过,1表示墙,2表示可以通,3表示已经走过但是走不通
//5.在走迷宫时需要确定一个策略(方法)下-右-上-左
public static boolean setWay(int [][] map,int i,int j)
{
if(map[6][5]==2)
{
//通路已经找到
return true;
}
else {
if (map[i][j] == 0) {
//如果当前这个点还没有找过
//按照策略走
map[i][j] = 2;//认为该点是可以走通的
if (setWay(map, i + 1, j)) {
//向下走
return true;
} else if (setWay(map, i, j + 1)) {//向右走
return true;
} else if (setWay(map, i - 1, j)) {//向上走
return true;
} else if (setWay(map, i, j - 1)) {//向左走
return true;
} else {
//说明该点是走不通的
map[i][j] = 3;
}
} else {
//如果map[i][j]不能于0,可能是1,2,3
return false;
}
}
return false;
}
//修改找路的策略 先上-右-下-左
public static boolean setWay2(int [][] map,int i,int j)
{
if(map[6][5]==2)
{
//通路已经找到
return true;
}
else {
if (map[i][j] == 0) {
//如果当前这个点还没有找过
//按照策略走
map[i][j] = 2;//认为该点是可以走通的
if (setWay(map, i - 1, j)) {//向上走
return true;
}
else if (setWay(map, i, j + 1)) {//向右走
return true;
}
else if (setWay(map, i + 1, j)) {
//向下走
return true;
} else if (setWay(map, i, j - 1)) {//向左走
return true;
} else {
//说明该点是走不通的
map[i][j] = 3;
}
} else {
//如果map[i][j]不能于0,可能是1,2,3
return false;
}
}
return false;
}
回溯实现迷宫问题
最新推荐文章于 2022-11-12 22:58:35 发布