米奇小老鼠走迷宫问题代码以及注释

代码浅析已在代码注释里,代码如下:

/*
 *@author 旧梦吖
 *@version 1.0
 * 走迷宫问题
 */
public class Maze {
    public static void main(String[] args) {
        //先设置一个迷宫 2 代表 墙    X 代表 小老鼠起始位置  Y 代表终点    0 代表空地  (7*7)
        /* 2 2 2 2 2 2 2
        *  2 0 0 0 0 0 2
        *  2 X 0 0 0 0 2
        *  2 2 2 2 0 0 2
        *  2 0 0 0 0 0 2
        *  2 Y 0 2 0 0 2     ---->
        *  2 2 2 2 2 2 2
        * */
        //初始化迷宫
        //二维数组
        int[][] arr = new int[7][7];
        //墙
        for(int i = 0; i < arr.length; i++){
            arr[0][i] = 2;//上围墙
            arr[6][i] = 2;//下围墙
            arr[i][0] = 2;//左围墙
            arr[i][6] = 2;//右围墙
        }
        //其他墙
        arr[3][0] = 2;
        arr[3][1] = 2;
        arr[3][2] = 2;
        arr[3][3] = 2;
        arr[5][3] = 2;
        //给地图和 小老鼠位置
        move(arr,1 ,2);
        //展示最后结果
        show(arr);
    }

    //展示迷宫    2为 墙    3为正确路线   9 为 小老鼠尝试走过的路线但没行通
    // PS:可以通过遍历把9都改为0更方便观看路线
    public static void show(int[][] arr){
        for(int i = 0; i < arr.length; i++){
            for(int j = 0; j <arr[i].length; j++){
                System.out.print(" " + arr[i][j]);
            }
            System.out.println();
        }
    }

    //小老鼠走迷宫方法

    /**
     * @param arr  传入的地图
     * @param x    小老鼠当前的左右位置  也就是数组的 int[][X];
     * @param y    小老鼠当前的上下位置  也就是数组的 int[Y][];
     * @return 用于返回,如果返回为真,则整条路线正确,如返回假,则错误路线的最后一个位置将被'堵住' 方便下一次判断不再进入此路线
     */
    public static boolean move(int[][] arr,int x, int y ){
        //停止方法  即到达了终点   设 3 为 小老鼠走过的路线  9则为尝试走过,但走不通,所以堵住为了下次不在尝试走   0空地可以走
        if(arr[5][1] == 3) return true; //说明小老鼠走过位置到达了终点

        if(arr[y][x] == 0) {  //说明当前位置是空地,可以走
            arr[y][x] = 3; // 走到这位置,将空地变成走过的路线
            // 因为是递归,所以在选择方向走后会再选择走,一直到最后死路或者找到终点停止;在返回true,返回的true又给上一步的if句,
            // 上一步的if句的返回又给上一步的上一步,如此,最后就都返回true,说明路线走通,只要有一个地方返回false,那么这个
            // 路线就是走不通的意思,然后在最后走不通的位置上设置为 9 ,即 伪障碍物 ,目的是为了下次判断时不在进入判断,就不会循环了
            // 就会尝试往别的方向走而不是一直往这个方向走,所以 伪障碍物是为了防止 走不通move方法再次进入if(arr[y][x] == 0)里里面
            if(move(arr,x,y-1)) return true; //尝试向上走
            if(move(arr,x+1,y)) return true; //尝试向右走
            if(move(arr,x,y+1)) return true; //尝试向下走
            if(move(arr,x-1,y)) return true; //尝试向左走

            //如果上下左右都不成功 即  四个方向都是  来时的路 墙  伪障碍物 其中之一 , 则设置最后到达的位置变为 伪障碍物,方便下一次
            //判断时不进入此条路线
            arr[y][x] = 9; //设置伪障碍物
        }
        //说明不为空地
        return false;

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值