如果说到递归思想,首先想到的肯定是一些比较常见的问题,什么阶乘,最大公约数,等等。
而这些也是比较简单很容易理解的。
而这一篇文章讲的问题是关于迷宫的一个小问题。
我们用二维数组来模拟一个迷宫:
“1”就是代表城墙的意思,右下角的“0”是终点位置,给一个起点位置,如果在不穿过城墙的情况下可以到达终点,那么就说这个起点位置是正确的。
很简单的一个游戏,如果我们用代码来找这么一条路的话应该怎么实现呢?
如果我们从红色的这个开始走,我们要用什么样的思路来实现呢。
我们可以规定一个步骤:
1.判断下面是否可以走?
2.下面不行,判断右边是否可以走?
3.右边不行,判断上面是否可以走?
4.上面不行,判断左面是否可以走?
5.如果都不能走,那么这个点就不能走到终点。OK,如果我们每次走的时候都要经历这五个步骤,似乎一直在重复,但是重复的似乎又有点不太一样,这时候就可以用递归的思想来解决。
我们看图,如果按照上面的步骤:
似乎行走的路线就是这样,OK,这样说思想已经有了的话,我们就用代码来实现一下。
我们就实现出这样一个方法:
public static boolean road(int map[][],int i,int j){
}
接收三个参数,第一个是二维数组(也就是地图),第二个和第三个代表起始位置的横纵坐标。
现在我把里面的方法写出来:
public static boolean road(int map[][],int i,int j){
if(map[5][4]==2){
return true;
}else{
if (map[i][j]==0){
map[i][j]=2;
if(road(map,i+1,j)){
return true;
}else if(road(map,i,j+1)){
return true;
}else if(road(map,i-1,j)){
return true;
}else if(road(map,i,j-1)){
return true;
}else{
map[i][j]=3;
return false;
}
}else{
return false;
}
}
}
在代码中,我们规定,如果路线正确,走过的路线就会被设置成2。
如果路线不能到达终点,那么走过路线就会被设置成3.
然后分四种情况(也就是我们刚才的规定)来进行递归。
最后我们用主函数来测试一下:
public static void main(String[] args) {
int map[][] = new int[7][6];
for (int i=0;i<7;i++){
map[i][0]=1;
map[i][5]=1;
}
for (int i=0;i<6;i++){
map[0][i]=1;
map[6][i]=1;
}
map[2][1]=1;
map[2][2]=1;
for (int i=0;i<7;i++){
for (int j=0;j<6;j++){
System.out.printf("%s ",map[i][j]);
}
System.out.println();
}
System.out.println("this is result");
road(map,1,1);
for (int i=0;i<7;i++){
for (int j=0;j<6;j++){
System.out.printf("%s ",map[i][j]);
}
System.out.println();
}
}
然后我们来看一下测试结果:
和我们刚才分析的也是一样的。
最后再说一句,刚刚规定的路线并不是唯一的,是自己设置的。
也可以设置成上右下左。
设置的不同最后走的路线也不同。
OK,一个用递归实现的小算法题也就做完了。