就是有起点,到终点有没有路。
约定0:未走,1:墙,2:可走,3:走过没通
迷宫:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
思路:
- 先是定好策略,先上后下,先左后右,
- 然后就是回溯的思想,先走走看走得通就是重点变为二,表示可以走到。
- 走不通就会退,也就是返回false,会回溯到上一节,在换路,全不行就继续回退换路,直到最外层完结
代码:
package ShangGuiGu.MiGong;
/**
* @author Mzh
* @date 2020-07-09 18:50
* @description:mzh
* @version: 1
*/
public class MiGong {
public static void main(String[] args) {
int[][] map=new int[8][7];
for (int i = 0; i < 7; i++) {
map[0][i]=1;
map[7][i]=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 i7 = 0; i7 < 7; i7++) {
System.out.print(map[i][i7]+" ");
}
System.out.println();
}
//找路
setWay(map,1,1);
System.out.println("bianguode");
for (int i = 0; i < 8; i++) {
for (int i7 = 0; i7 < 7; i7++) {
System.out.print(map[i][i7]+" ");
}
System.out.println();
}
}
//终点map[6][5],
//约定0:未走,1:墙,2:可走,3:走过没通
//策略:下右上左,不通回溯
/**
* 递归找路
* @param map 地图
* @param i 从哪个位置找
* @param j
* @return 返回true找到
*/
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,j+1)){//向上走
return true;
}else if(setWay(map,i,j+1)){//向左走
return true;
}else{
//走不通
map[i][j]=3;
return false;
}
}else{//可能123
return false;
}
}
}
}