如果说到递归思想,首先想到的肯定是一些比较常见的问题,什么阶乘,最大公约数,等等。
而这些也是比较简单很容易理解的。

而这一篇文章讲的问题是关于迷宫的一个小问题。

我们用二维数组来模拟一个迷宫:

java 队列 迷宫 通路 java迷宫问题_算法

“1”就是代表城墙的意思,右下角的“0”是终点位置,给一个起点位置,如果在不穿过城墙的情况下可以到达终点,那么就说这个起点位置是正确的。

很简单的一个游戏,如果我们用代码来找这么一条路的话应该怎么实现呢?

java 队列 迷宫 通路 java迷宫问题_算法_02


如果我们从红色的这个开始走,我们要用什么样的思路来实现呢。

我们可以规定一个步骤:

1.判断下面是否可以走?

2.下面不行,判断右边是否可以走?

3.右边不行,判断上面是否可以走?

4.上面不行,判断左面是否可以走?

5.如果都不能走,那么这个点就不能走到终点。OK,如果我们每次走的时候都要经历这五个步骤,似乎一直在重复,但是重复的似乎又有点不太一样,这时候就可以用递归的思想来解决。

我们看图,如果按照上面的步骤:

java 队列 迷宫 通路 java迷宫问题_java_03

似乎行走的路线就是这样,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();
        }
    }

然后我们来看一下测试结果:

java 队列 迷宫 通路 java迷宫问题_System_04


和我们刚才分析的也是一样的。

最后再说一句,刚刚规定的路线并不是唯一的,是自己设置的。

也可以设置成上右下左。

设置的不同最后走的路线也不同。
OK,一个用递归实现的小算法题也就做完了。