常见问题:
小伙伴们在第一次遇到该问题时,思路大家都能清楚,就是遇到走不通的时候就换方向走,但是却不知道代码是如何走的。
解决问题:
代码如下:
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 < map.length;i++) {
for(int j = 0;j<map[ i ].length;j++) {
System.out.print(map[ i ][ j ]);
}
System.out.println();
}
Mouse t1 = new Mouse();
t1.findway(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();
}
}
}
class Mouse{
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 {
return false;
}
}
代码分析:
这段代码主要用二维数组生成一个地图,其中1表示围墙。不可走。0表示可以走。
这段代码主要是判短老鼠如何走。然后下面就是对这段代码的一个分析:(其中1表示地图不能走,0表示地图可以走,老鼠通过0后,将该位置改为2)
当执行t1.findway(map,1,1); 将i=1,j=1带入方法,执行第一个if语句:
if(map[ 6 ][ 5 ] ==2) {
return true;
}
很明显不满足条件,执行他的else语句:
else
if(map[ i ][ j ] == 0 ){
map[ i ][ j ] =2;
if(findway(map,i+1,j)) {
return true;
}
这里就是判断map[1][1]是否为0,为0说明地图可以走,老鼠走后把该位置赋值为2.同时继续执行
if(findway(map,i+1,j)) {
return true;
}
这个意思就是继续向下走,同时调用方法,也返回一个true。然后重复执行
else
if(map[ i ][ j ] == 0 ){
map[ i ][ j ] =2;
if(findway(map,i+1,j)) {
return true;
}
向下走两次以后得到如图所示
在想向下走的时候会发现是个1(一堵墙)于是(这里就是一个关键,很多伙伴就卡在这里)
此时i=3,j=1;因为
if(map[ 6 ][ 5 ] ==2) {
return true;
}
这段代码不满足,所以返回一个flase,(为什么返回flase可以向上面看代码)此时的flase是返回调用者 :
findway(map,2+1,j)
所以
findway(map,2+1,j) = flase;
等同于:
if(findway(map,2+1,j)) {
return true;
}
if(flase) {
return true;
}
,所以执行下面的if语句
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;
}
同理可以得如何执行的上下左右。
运行结果如下:
1111111
1200001
1222001
1112001
1002001
1002001
1002221
1111111