java 递归回溯 迷宫小游戏 思路分析加代码

package xin.com.x07;

package xin.com.x07;

public class game {
    //迷宫游戏

    /*
     * @作者: 12032
     * @方法描述: 找路方法,
     * 1.找到路返回true
     * 2.1代表障碍物  2.代表可以通过  3 代表走过但是不同;
     * 3.找路的顺序是下右上左 逆时针顺序;
     * 4.使用递归回溯的思想
     * @日期: 10:03 2021/11/2
     * @Param: [map, i, j];
     * @返回参数类型: boolean
     **/
    static boolean findWay(int[][]map,int i,int j){

        //判断是否找到出口;找到输出true  没有继续找
        if(map[6][5] == 2){
            return true;
        }else {//首先判断当前位置是否为0 即没有走过的
            if(map[i][j] == 0) {
                //假定当前位置正确;
                map[i][j] = 2;
                //递归验证当前位置是否可以到达下一位置,如果可以返回true;
                if (findWay(map, i + 1, j)) {
                    return true;
                } else if (findWay(map, i, j + 1)) {
                    map[i][j + 1] = 2;
                    return true;
                } else if (findWay(map, i, j - 1)) {
                    map[i][j - 1] = 2;
                    return true;
                } else if (findWay(map, i - 1, j)) {
                    map[i - 1][j] = 2;
                    return true;
                } else {
                    //如果不可以到达下一位置,就设置3 表示走过但是不能出去,
                    //当程序走到最后一步发现不是出口而是死胡同的时候;会回溯(逐步跳出递归的程序)把每个走过的位置变成3
                    map[i][j] = 3;
                    return false;
                }
            }
        }
        return false;
    }

    public static void main(String[] args) {

        //设置迷宫地图
        //1.设置迷宫大小
        int[][] map = new int[8][7];
        //2.设置障碍物
        //  第一行和最后一行设置为1
        for(int i = 0;i<map[i].length;i++){
            map[0][i]=1;
            map[7][i]=1;
        }
        //  第一列和最后一列设置为1
        for (int i = 0 ; i<map.length;i++){
            map[i][0]= 1;
            map[i][6]=1;
        }
        //  单独设置障碍物
        map[3][1] = 1;
        map[3][2] = 1;
        map[3][3] = 1;
        map[2][3] = 1;
        map[0][3] = 1;
        map[6][4] = 1;

        //遍历输出初始迷宫图;
        System.out.println("开始之前的迷宫图");
        for (int i = 0 ; i<map.length;i++){
            System.out.println("");
            for (int j = 0 ; j<map[i].length;j++){
                System.out.print(map[i][j]+"\t");
            }
        }
        // 调用方法找出路:
        System.out.println("\n"+findWay(map,1,1));
        //输出走出迷宫的道路线
        System.out.println("出路");
        for (int i = 0 ; i<map.length;i++){
            System.out.println("");
            for (int j = 0 ; j<map[i].length;j++){
                System.out.print(map[i][j]+"\t");
            }
        }

    }
}
运行结果  1代表障碍物 2代表出路  3代表做过但是行不通


进行测试 无出路的情况: 
 //  单独设置障碍物
        map[3][1] = 1;
        map[3][2] = 1;
        map[3][3] = 1;
        map[2][3] = 1;
        map[1][3] = 1;
        map[0][3] = 1;
        map[6][4] = 1;

结果
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
总结:

这个小游戏很好的解释了递归和回溯,

递归:简单来说就程序自己调用自己;

 回溯:回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。

 以上就是个人对于这个小游戏的总结和感悟;有什么不对的还请留言,谢谢。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您解答这个问题。 迷宫问题是指在一个迷宫中,从起点到终点的路径问题。现在我们来看看如何用递归回溯来解决这个问题。 1. 定义状态空间:我们可以用一个二维数组来表示迷宫,其中 0 表示道路,1 表示障碍物,2 表示已经走过的路。 2. 定义决策空间:从当前位置开始,尝试向上、下、左、右四个方向移动,如果该位置合法,则继续往下进行,否则就回溯。 3. 定义终止条件:当到达终点时,就找到了一条路径。 4. 实现递归回溯: ```python def backtrack(maze, row, col, path): # 如果已经到达终点,则直接返回 if row == len(maze)-1 and col == len(maze[0])-1: print(path) return True # 尝试向上、下、左、右四个方向移动 directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] for d in directions: n_row, n_col = row + d[0], col + d[1] # 判断当前位置是否合法 if 0 <= n_row < len(maze) and 0 <= n_col < len(maze[0]) and maze[n_row][n_col] == 0: # 如果合法,则标记为已经走过,并继续往下进行 maze[n_row][n_col] = 2 path.append((n_row, n_col)) if backtrack(maze, n_row, n_col, path): return True # 如果不合法,则回溯,将当前位置标记为道路,将当前位置从路径中删除 maze[n_row][n_col] = 0 path.pop() return False maze = [[0, 1, 0, 0, 0], [0, 1, 0, 1, 0], [0, 0, 0, 0, 0], [0, 1, 1, 1, 0], [0, 0, 0, 1, 0], [1, 1, 0, 0, 0]] backtrack(maze, 0, 0, [(0, 0)]) ``` 在上述代码中,我们使用一个二维数组 `maze` 来表示迷宫,其中 0 表示道路,1 表示障碍物,2 表示已经走过的路。在 `backtrack` 函数中,我们首先判断当前位置是否已经到达终点,如果是,则找到了一条路径;否则,我们尝试向上、下、左、右四个方向移动,找到合法的位置后,将其标记为已经走过,并继续往下进行。如果到达终点,则返回 True;否则就回溯,将当前位置标记为道路,将当前位置从路径中删除,继续尝试其他方向。在 `maze` 数组中,如果一个位置为 1 表示该位置为障碍物,不能通过;如果一个位置为 2,表示该位置已经走过,不能重复走。 以上就是用递归回溯来解决迷宫问题的过程。在实际应用中,我们可以根据具体问题的特点来定义状态空间、决策空间和终止条件,然后使用递归回溯来求解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值