递归之迷宫回溯问题(分析与实现)

迷宫问题:

如图,迷宫大小为8行7列。红色区为墙,蓝色小球只能在白色区域走动 。
在这里插入图片描述
具体说明:

1、map 表示迷宫;

2、i、j 表示从迷宫的哪个位置开始出发(假设从1,1出发);

3、如果小球能到 map[6] [5] 的位置,说明小球已找到通路。

4、设置:
当 map[i] [j] =0 :表示该点没有走过;
当 map[i] [j] =1 :表示墙和挡板;
当 map[i] [j] =2 :表示该点可以走;
当 map[i] [j] =3:表示该点可以走,但走不通;

5、小球走迷宫时,需要确定走的方向,假设为 下 → 右 → 上 → 左,如果该点走不通,再回溯。

实现代码如下:

package com.ycx.recursion;

public class MiGong {
    public static void main(String[] args) {
        //先创建一个二维数组:模拟迷宫
        int[][] map = new int[8][7];

        //使用数字1表示墙
        for (int i = 0; i <7 ; i++) {
            //第一行和第八行全部置为1
            map[0][i]=1;
            map[7][i]=1;
        }
        for (int i = 0; i <8 ; i++) {
           //第一列和第七列全部置为1
            map[i][0]=1;
            map[i][6]=1;
        }

        //设置挡板 也用1表示
        map[3][1]=1;
        map[3][2]=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();
        }

        setWay(map,1,1); //从(1,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();
        }

        /*
        1、map 表示迷宫;
        2、i、j 表示从迷宫的哪个位置开始出发(假设从1,1出发);
        3、如果小球能到 map[6] [5] 的位置,说明小球已找到通路。
        4、设置:
                当 map[i] [j] =0 :表示该点没有走过;
                当 map[i] [j] =1 :表示墙和挡板;
                当 map[i] [j] =2 :表示该点可以走;
                当 map[i] [j] =3:表示该点可以走,但走不通;
        5、小球走迷宫时,需要确定走的方向,假设为 下 → 右 → 上 → 左,如果该点走不通,再回溯。
       */
    }

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

    }
}

运行结果如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章