图中1表示墙,0表示可走的路。
问题描述:如何从左顶角的零,走到右上角的零
public class MiGong {
public static void main(String[] arsg) {
//先创建一个二维数组,模拟迷宫
//地图
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 i=0;i<8;i++ ) {
map[i][0]=1;
map[i][6]=1;
}
//设置挡板
map[3][1]=1;
map[3][2]=1;
//输出地图
for(int i=0;i<8;i++) {
for(int j=0;j<7;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
//使用递归回溯给小球找路
setWay(map,1,1);
//输出新的地图,小球走过并标视过的递归
System.out.println("小球走过并标识的地图情况");
for(int i=0;i<8;i++) {
for(int j=0;j<7;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
//使用修改后的策略进行测试
setWay2(map,1,1);
System.out.println("小球按照新的策略进行的结果");
for(int i=0;i<8;i++) {
for(int j=0;j<7;j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
//使用递归回溯来给小球找路
//约定:当map[i][j]为0表示该点没有走过,1表示当前为墙,2表示当前通路可以走,3表示该点已经走过,当时走不通
//走迷宫的策略:下=>右=>上=>左,如果该点走不同就回溯
public static boolean setWay(int[][] map,int i,int j) {
//map表示地图 i 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;
return false;
}
}else {//如果map[i][j] != 0,可能是1,2,3
return false;
}
}
}
//修改找路的策略,改成上=>右=>下=>左
public static boolean setWay2(int[][] map,int i,int j) {
//map表示地图 i j表示从那个位置开始找
if(map[6][5] == 2) {
return true;
}else {
if(map[i][j]==0) {
//如果当前这个点还没有走,按照策略上=>右=>下=>左
map[i][j]=2;//假定该点能走通
if(setWay2(map,i-1,j)) {//向上走
return true;
}else if(setWay2(map,i,j+1)) {//向右走
return true;
}else if(setWay2(map,i+1,j)) {//向下走
return true;
}else if(setWay2(map,i,j-1)) {//向左走
return true;
}else {
//说明该点是走不通,是死路
map[i][j] = 3;
return false;
}
}else {//如果map[i][j] != 0,可能是1,2,3
return false;
}
}
}
}
结果展示:
按照第一种策略:下=>右=>上=>左,找到的通路
按照第二种策略:上=>右=>下=>左,找到的通路
本文为观看视频所学,具体学习可观看视频https://www.bilibili.com/video/BV1E4411H73v/?p=46&spm_id_from=pageDriver&vd_source=30ca67484a16e9106a61116f02f47d58