第 6 章 递归(2)(迷宫问题)

news2025/1/26 15:50:14

6.6.1 迷宫问题

在这里插入图片描述

6.6.2 代码实现

package pers.th.d6_recursion;

/**
 * 递归-迷宫问题
 */
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 < 7; i++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }
        //设置挡板,1 表示
        map[3][1] = 1;
        map[3][2] = 1;

        //输出地图
        System.out.println("地图的情况");
        for (int[] row : map) {
            for (int i : row) {
                System.out.print(i + " ");
            }
            System.out.println();
        }

        setWay(map, 1, 1);
//        setWay2(map, 1, 1);

        //输出新的地图,小球走过,并标识过的递归
        System.out.println("小球走过,并标识过的递归");
        for (int[] row : map) {
            for (int i : row) {
                System.out.print(i + " ");
            }
            System.out.println();
        }
    }

    //使用递归回溯来给小球找路
    //说明
    //1.map 表示地图
    //2. i,j 表示从地图的那个位置开始出发(1,1)
    //3.如果小球能到map[6][5]位置,则说明通路找到
    //4.约定:当map[i][j]为0,表示该点没有走过;当为1,表示墙;2 表示通路可以走;3 表示该点已经走过,但是走不通;
    //5.在走迷宫时,需要确定一个策略(方法)下-右-上-左,如果该点走不通,再回溯

    /**
     * @param map 表示地图
     * @param i   表示从地图的那个位置开始出发
     * @param j
     * @return 如果找到通路,就返回true,否则返回false
     */
    public static boolean setWay(int[][] map, int i, int j) {
        if (map[6][5] == 2) {//通路已经找到 ok
            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;
                }
            } else {//如果map[i][j] != 0,可能是 1,2,3
                return false;
            }
        }
        return true;
    }

    //修改找路的策略 上-右-下-左
    public static boolean setWay2(int[][] map, int i, int j) {
        if (map[6][5] == 2) {//通路已经找到 ok
            return true;
        } else {
            if (map[i][j] == 0) {//如果当前这个点还没有走过
                //按照策略 上-右-下-左
                map[i][j] = 2;//假定该点是可以走通.
                if (setWay2(map, i - 1, j)) {//向上走
                    return true;
                } else if (setWay2(map, i, j + 1)) {//向右走
                    return true;
                } else if (setWay2(map, i + 1, j)) {//向下走
                    return true;
                } else if (setWay2(map, i, j - 1)) {//向左走
                    return true;
                } else {
                    //说明该点是走不通,是死路
                    map[i][j] = 3;
                }
            } else {//如果map[i][j] != 0,可能是 1,2,3
                return false;
            }
        }
        return true;
    }
}

调用setWay()方法:

地图的情况
1 1 1 1 1 1 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 1 1 0 0 0 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 1 1 1 1 1 1 
小球走过,并标识过的递归
1 1 1 1 1 1 1 
1 2 0 0 0 0 1 
1 2 2 2 0 0 1 
1 1 1 2 0 0 1 
1 0 0 2 0 0 1 
1 0 0 2 0 0 1 
1 0 0 2 2 2 1 
1 1 1 1 1 1 1 

调用setWay2()方法:

地图的情况
1 1 1 1 1 1 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 1 1 0 0 0 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 0 0 0 0 0 1 
1 1 1 1 1 1 1 
小球走过,并标识过的递归
1 1 1 1 1 1 1 
1 2 2 2 2 2 1 
1 0 0 0 0 2 1 
1 1 1 0 0 2 1 
1 0 0 0 0 2 1 
1 0 0 0 0 2 1 
1 0 0 0 0 2 1 
1 1 1 1 1 1 1 

6.6.3 对迷宫问题的讨论

1)小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关
2)再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化
3)测试回溯现象
4)思考: 如何求出最短路径?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/913433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库:内置函数

日期函数 规定&#xff1a;日期&#xff1a;年月日 时间&#xff1a;时分秒 函数名称作用描述current_date()当前日期current_time()当前时间current_timestamp()当前时间戳date(datetime)返回datetime参数的日期部分date_add(date,interval d_value_type)在date中添加…

畜牧兽医虚拟仿真|病禽解剖VR模拟操作演练系统

在生物学课程中&#xff0c;动物解剖是一个重要的组成部分&#xff0c;它能够帮助学生了解动物的生理结构、功能和生活习性&#xff0c;从而更好地认识和保护自然界的生物多样性。然而&#xff0c;传统的动物解剖教学方法往往局限于课堂教学和实验室实践&#xff0c;学生很难真…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 4 Data store标签页介绍

这篇文章我们继续讲解code-mapping的Data stores页,这个页的内容对应的SIMULINK中的模块是Data store memory。 我们首先在模型中创建一个Data store memory模块,如图: Data store memory模块的作用相当于一个全局变量,我们可以在模型的功能逻辑里将一个信号存进去,在另…

【计算机网络篇】TCP协议

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; TCP协议 1&#xff0c;TCP 简介 TCP&#xff08;Transmission Control Protocol&#xff09;是…

Linux系统使用service设置程序自启动

Linux系统使用service设置程序自启动 整体描述前期准备1. 生成pid文件 具体方法1. 脚本编写1.1 start.sh脚本1.2 shutdown.sh脚本1.3 restart.sh脚本 2. 设置service2.1 service文件2.2 设置自启动2.3 查看设置结果 整体描述 在linux系统里&#xff0c;设置程序自启动是基本操…

基于Vue3.0的优秀低代码项目

在众多开发技术中&#xff0c;Vue组件化开发技术以其卓越的灵活性和高效性备受瞩目。借助Vue3.0的强大功能和简洁易用的语法&#xff0c;你将能够轻松打造出最令人瞩目的低代码项目。 低代码开发正成为当前企业提升运营效率、降低开发成本的首选方案。相较于传统开发模式&#…

基于Singularity 安装 AmpliconSuite-pipeline

基于Singularity 安装 AmpliconSuite-pipeline 按照AmpliconSuite-pipeline官网的Singularity安装方法遇到不少问题&#xff0c;好在都一一解决了&#xff0c;写个文档记录一下我基于Singularity 安装 AmpliconSuite-pipeline的过程。 step1 获取 Singularity镜像 镜像地址&…

如何截掉图片中的一部分?

如何截掉图片中的一部分&#xff1f;在社交媒体的热潮下&#xff0c;我们常常需要将自己生活中的照片或者美景图片分享到互联网或者自己的朋友圈中。然而&#xff0c;有时候我们会发现照片中存在一些不需要的元素&#xff0c;这可能会降低照片的美观程度。针对这种情况&#xf…

分布式核心知识以及常见微服务框架

分布式中的远程调用 在微服务架构中&#xff0c;通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分&#xff1a;序列化和通信协议。常见的序列化协议包括json、xml、 hession、 protobuf、thrift、text、 bytes等&#xff0c;目前主流的远程调用技术有基于HTTP…

C语言刷题训练DAY.10

1.空心正方形图案 解题思路&#xff1a; 这里我们只把四条边的内容打印成*&#xff0c;其他内容打印成空格即可。 解题代码&#xff1a; #include <stdio.h> int main() {int n 0;while (scanf("%d", &n) ! EOF){int i 0;for (i 0; i < n; i) //外…

Stream流报错Duplicate key

目录 1、场景2、问题3、解决办法4、完整代码 1、场景 有一个客户列表&#xff0c;每个item里有客户id、name、客户开的公司。 现在根据客户id分组&#xff0c;以客户id为key&#xff0c;把id相同的放到value里&#xff0c;构建一个Map。 这样可以快速根据id&#xff0c;获取相…

LLM赋能产业数智化业务系统升级的思考

1概述 2022年是人工智能的一个分水岭&#xff0c;ChatGPT&#xff0c;DALL E[ DALL E&#xff1a;是一款可以根据文本描述创建图像的AI工具。]和Lensa[ Lensa&#xff1a;是一款AI美图软件。]等几个面向消费者的应用程序发布了&#xff0c;它们的共同主题是使用生成式人工智能&…

【日常积累】Cookie和Session的区别

背景 会话&#xff08;Session&#xff09;跟踪是Web程序中常用的技术&#xff0c;用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份&#xff0c;Session通过在服务器端记录信息确定用户身份。 本章将分享一些关于Cooki…

【高危】MarkText<=0.17.1 存在DOM型XSS漏洞 (CVE-2023-2318)

漏洞描述 MarkText 是热门的开源Markdown编辑器&#xff0c;覆盖Windows/Linux/MacOS平台。 MarkText 0.17.1及之前版本中的 pasteCtrl 类未对用户可控的 HTML 内容进行过滤&#xff0c;当用户将攻击者可控的 HTML 代码粘贴至 MarkText 编辑器中时&#xff0c;攻击者可利用DO…

鸿蒙应用开发之基础组件

一、组件简介 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大类&#xff1…

Leetcode---359周赛

题目列表 2828. 判别首字母缩略词 2829. k-avoiding 数组的最小总和 2830. 销售利润最大化 2831. 找出最长等值子数组 一、判断首字母缩略词 纯模拟&#xff0c;代码如下 class Solution { public:bool isAcronym(vector<string>& words, string s) {string tmp…

如何将pdf文件转换成word文档?

如何将pdf文件转换成word文档&#xff1f;PDF文档是我们日常办公中最为常用的电子文档格式的文件&#xff0c;也是在会议、教育培训以及商业营销中经常使用的文档格式。所以说PDF文档的功能较强&#xff0c;且应用场景较多。但是也有例外的时候&#xff0c;比如我们需要将PDF文…

vue项目中使用ts的枚举类型

vue项目中要使用ts的枚举类型需要为script标签的lang属性添加ts属性值 <script lang"ts" setup> </script > 声明枚举类型&#xff1a; //语法 /* enum 枚举名称 {可能的值 }*/ enum scenic_status {"正常" 1,"审核中","暂停…

Prometheus 监控系统---你值得拥有

目录 一&#xff1a;Prometheus 1、Prometheus 概述 2、应用场景 3、Prometheus 的特点 4、Prometheus 的生态组件 &#xff08;1&#xff09;Prometheus server&#xff1a;服务核心组件 &#xff08;2&#xff09;Client Library: 客户端库 &#xff08;3&#xff0…

c语言(12)

第一题 容易下意识认为这个判断是ASCII码值在0到9之间&#xff01; 第二题 第三题 第四题 第五题 第六题 用递归很容易就解决了 第七题