该文章是对韩顺平的《零基础快速学Java》中P223的其中一个判断条件做出的个人解读,如有误请指出。
源码如下:
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;
map[2][1] = 2;
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();
}
System.out.println();
T t1 = new T();
t1.findWay(map, 1, 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();
}
}
}
class T{
public boolean findWay(int[][] map , int i, int j){
if(map[6][5] == 2){
return true;
} else{
if(map[i][j] == 0){
map[i][j] = 2;
if(findWay(map, i + 1, j)){
return true;
} else if(findWay(map, i, j + 1)){
return true;
} else if(findWay(map, i - 1, j)){
return true;
} else if(findWay(map, i, j - 1)){
return true;
} else{
map[i][j] = 3;
return false;
}
} else{ //map[i][j] = 1, 2, 3
return false;
}
}
}
}
在第37行时,本人对于判断条件是map[i][j] == 0还是map[i][j] == 0 || map[i][j] == 2想了很久,以下是个人见解。
图1
如图1所示,假设黑色为一开始就设定好的,蓝色是程序运行时被标记的。
map[i][j] == 0:假设执行到1号蓝色2时,向下、向右、向上、向左都走不了(向下为3,其他为2,即返回了false),再将1号蓝色2赋值为3,于是返回上一层递归,也就是返回到2号蓝色2,此时的递归已经判断完向下走不了,继续判断向右、向上、向左(都为2)...以此类推,直到4号蓝色2,向下判断过了,继续判断向右,向右为0可以走。优点:一条路走不通立刻回到初始位置。(以上描述称为“回溯现象”)
由此可以看出,map[i][j] == 2的意思是,之前已经判断过此路可通,但是走到最后一步的时候碰到了3,所以这条路再走判断就会多余,所以直接换条没有2的路走。
用语言表达不清楚,用人话讲就是在走迷宫的时候,你走过很长的路,虽然这一路上可以通过且没有障碍,但是最后是死路,所以下一次再路过迷宫此处的时候就不会按照相同路径再走一遍,因为走过的路会从0变为2。
(语言表达能力实在是太差了,如果有误请指出!感谢!)