其他分享
首页 > 其他分享> > 迷宫问题

迷宫问题

作者:互联网

java初学笔记——迷宫问题

问题描述:

现在有一个迷宫,红色的是障碍物

假设有一个人在蓝色格子处,需要走到紫色格子处才能走出迷宫,本次会用到递归

如果让你现在这样看,你觉得很简单,一眼就看出来了,事实上的确如此...你有许多种走法,你甚至可以绕一圈再出去,如果你在迷宫里面呢?如果这个格子迷宫要复杂的多呢?但是现在只需要知道最简单的思路,后面的简单一些了

回到正题,仔细观察这个迷宫,有行数也有列数(感觉是废话),在基础编程语言里,能够同时存储行数和列数的——二维数组,如果将这个迷宫有二维数组表示呢?那么它就是一个八行七列的二维数组(假设数组为arr[][]),那么蓝色格子就可以用坐标表示为arr[1][1],紫色格子就可以表示为arr[6][5],现在就需要让这个人从arr[1][1]--->arr[6][5],那么,如何让计算机知道呢?

有一个简单的方法,将0设置为可以走的路,将1设置为障碍物(我只是觉得这样比较好记,你要设为其他的数,5678都行,这只是一个标志而已),即红色的部分

//1.先创建迷宫,用二维数组表示 8行7列 int[][] map = new int[8][7]; //2.0表示可以走,1表示障碍物 map[3][1] = 1; map[3][2] = 1; //3.将四周设置为障碍物 for (int i = 0; i < a; i++) { map[0][i] = 1; map[7][i] = 1; } for (int i = 0; i < a + 1; i++) { map[i][0] = 1; map[i][6] = 1; }

现在,计算机知道了边界,那么如何让它动起来?需要在设置两个数:假设2为走过的路(这个和0可以走的路意义不一样),假设3为死路(你要想设置5,6,7,8也无所谓,全看你自己),假定找到路径返回true,否则返回false,那么就有了判断出去的办法:

if (map[a][b] == 2) { return true; }

也就是说,如果终点处被设置为2,那么就一定知道到了终点,直接返回true就好了,那么,如果没有一开始找到终点怎么办?那就让他找,走过一个格子,将格子里面的数从0-->2,走一个标记一个格子,那么现在还有一件事,就是方向,你决定让他如何去找,上下左右四个方向,先去哪里?这个完全就看你了,我这里只是举一个例子,让他按照下-右-左-上的顺序去找,那么,如何让计算机知道上下左右四个方向呢--->坐标,用坐标表示,假设你在(i,j)这个点:那么

其余点的坐标就是这样,你也可以斜着找,都可以,找到坐标的规律就好了,你甚至可以自己设定一套找路径的规则,这里就不展示了,只做最基础的论述,那么,现在找的思路理清楚了,

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;
    }

这就是找的路径

现在还有一个问题


就是这种情况,如果我新加了一个障碍,按照我设定的路径去找,下右都是死路,上边被找过了,怎么办--->回溯,这就是递归的特性,回到上面蓝色的格子,并且将这个格子标记为3,那么这里也就成了死路,等同于障碍物,然后再按照顺序找下去,还记得上面说过的,找到正确的返回true吗?这就是一层一层的返回,知道找到了终点,并且返回为true,一层一层的返回true,直至返回最底层,就是栈的顺序,先入后出,递归也是如此

你也可以试一下按照这个路径顺序将终点设置为(6,1),然后对照这路径图,一步一步地走,这样你会更好的理解递归

附一下完整代码:

public class Maze {
    public static void main(String[] args) {
        int a = 7;
        //1.先创建迷宫,用二维数组表示 8行7列
        int[][] map = new int[8][7];
        //2.0表示可以走,1表示障碍物
        map[3][1] = 1;
        map[3][2] = 1;
        //3.将四周设置为障碍物
        for (int i = 0; i < a; i++) {
            map[0][i] = 1;
            map[7][i] = 1;
        }
        for (int i = 0; i < a + 1; i++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }
        //4.输出当前的地图
        System.out.println("当前地图为:");
        for (int[] ints : map) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }

        //5.找路
        T3 t3 = new T3();
        t3.findway(map, 1, 1);
        System.out.println("=========找路的路径============");
        for (int[] ints : map) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }
    }
}


class T3 {
    static int a = 6;
    static int b = 5;
    static int c = 2;

    public boolean findway(int[][] map, int i, int j) {
        if (map[a][b] == c) {
            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;
            }
        }
    }
}

最后贴一张代码的流程图,能够帮助你理解

标签:map,return,findway,int,迷宫,else,问题,true
来源: https://www.cnblogs.com/FZLS-/p/15170466.html