问题描述:
如下图,迷宫方格。目的:小黑走到小黄所在位置,即为成功。其中红色表示墙。黑色为起点,黄色为终点。
思想:递归 回溯
分析(想象一下是你在走迷宫):
1.你的目的是:从起点走到终点
2.设想一下你当前处于迷宫某一位置,开始走(往前后左右四个方向走)。
3假设第一步:往前走。那么第二部怎么走?(你是随机的走,还是用一种策略走。随机的意思是:第一步往前,第二部往前也可以走通,但是你想随心所欲,于是前后左右随便选了一条。策略的意思是:第一步往前,第二部也往前,如果往前走不通,就往右,右边走不通,就往左,左面不同,则往后。此时你的策略是前–右--左–后。)
代码:
public static void main(String[] args){
//首先生成二位数组代替地图
int[][] map = new int[10][10];
//设置墙体障碍
//在此 规定:红色 为1 表示墙体;白色未走过 为0 表示可走;
//白色 走过的 为2 表示已走过; 走不通的为3 表示死路
//设置障碍
for(int i=0;i<10;i++){
map[i][0]=1;
map[i][9]=1;
}
for(int j=0;j<10;j++){
map[0][j]=1;
map[9][j]=1;
}
map[2][3]=1;
map[2][6]=1;
map[5][2]=1;
map[5][7]=1;
map[6][3]=1;
map[6][6]=1;
map[7][4]=1;
map[7][5]=1;
map[8][5]=1;
for(int i=0;i<map.length;i++){
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
//调用
setWay(map,1,1);
System.out.println("找到路径:");
for(int i=0;i<map.length;i++){
for (int j = 0; j < map[i].length; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
/**
*map 表示地图
*i、j 表示位置
*投石问路
*/
public static boolean setWay(int[][] map,int i,int j){
if(map[8][8]==2){
return true;
}else {
if(map[i][j]==0){
//可以理解为 来到map[i][j]的位置
//然后处于map[i][j] 的位置情况下 判断你的下一步 上下左右哪个方向可走
//策略:下--右--上--左
map[i][j]=2;
if(setWay(map,i+1,j)){
//在i,j 的位置 向下走;此时递归调用自己,来到i+1,j的位置。然后再判断
//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{
return false;
}
}
}