数据结构与算法-迷宫问题

递归-迷宫问题

一个8行7列的迷宫,最外侧都是墙,(3,1)(3,2)为挡板,小球从(1,1)出发,如何走到(6,5)

迷宫如下

  • 1表示墙或者挡板,无法走
  • 规定 若小球可以走的通路 标记2
  • 规定 若小球已经走过,但是无法走通的点 标记3
  • 规定地图没有走过的点, 标记为0
1 1 1 1 1 1 1
1 1
1 1
1 1 1 1
1 1
1 1
1 目的地 1
1 1 1 1 1 1 1
代码实现如下:
public class Migong {
    public static void main(String[] args) {
        //创建二维数组,模拟迷宫
        //地图
        int[][] map = new int[8][7];
        //使用1表示墙
        //上下全部置为1
        for(int i = 0; i < 7; i++) {
            map[0][i] = 1;
            map[7][i] = 1;
        }
        //左右全部置为1
        for(int i = 0; i < 8; i++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }
        //设置挡板
        map[3][1] = 1;
        map[3][2] = 1;
        //输出地图
        System.out.println("地图的情况");
        for(int i = 0; i < 8; i++) {
            for(int j = 0; j < 7; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }

        //使用递归回溯,给小球找路
        setWay(map,1,1);
        //输出新的地图
        System.out.println();
        System.out.println("小球走过的,且标识过的地图的情况");
        for(int i = 0; i < 8; i++) {
            for(int j = 0; j < 7; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }

    /**
     * 使用递归给小球找路(1,1)到(6,5)
     * @param map   地图
     * @param i     小球初始位置行
     * @param j     小球初始位置列
     * @return      返回是否找到,true,false
     */
    //约定:当地图为0时,表示该点没有走过 当为1时,为墙 为2时,表示通路,可以走 为 3 时,已经走过,但是走不通
    //在走迷宫时,需要确定一个策略,先走下面,然后右,上,左           下 - 右 - 上 - 左,若走不通,再回溯
    public static Boolean setWay(int[][] map, int i, int j) {
        if(map[6][5] == 2) {    //通路找到
            return true;
        }else {
            if(map[i][j] == 0) {    //若当前这个点没有走过
                //按照策略走
                map[i][j] = 2;      //假定可以走通
                if(setWay(map,i + 1,j)) {     //向下走
                    return true;
                }else if(setWay(map,i,j + 1)){    //若不行,向右走
                    return true;
                }else if(setWay(map, i - 1, j)) {   //还是不行,向上走
                    return true;
                }else if(setWay(map,i,j - 1)){      //最后,没辙了,向左走
                    return true;
                }else {
                    //说明该点是走不通的,死路
                    map[i][j] = 3;
                    return false;
                }
            }else { //如果map[i][j] != 0 可能为 1 2 3,
                //1 为墙,不能走
                //2 为能走,且走过了,不行
                //3 为走不通
                return false;
            }
        }
    }
}

执行情况
结论
  • 默认策略使用 下 右 上 左
  • 随着策略的不同,路线也不同
  • 最短路径问题可以使用for循环将所有策略走一遍得到(在没有学习其他算法的情况下

猜你喜欢

转载自www.cnblogs.com/yfyyy/p/12769057.html
今日推荐