迷宫游戏(c++)

我们来玩一个迷宫游戏,尝试走一下面的迷宫。

迷宫游戏
我们用一个二维的字符数组来表示前面画出的迷宫:

S**.
....
***T

其中字符S表示起点,字符T表示终点,字符*表示墙壁,字符.表示平地。你需要从S出发走到T,每次只能向上下左右相邻的位置移动,不能走出地图,也不能穿过墙壁,每个点只能通过一次。你需要编程来求解出一种从起点到终点的走法。

很明显,当我们从任意格子出发,都有可能往四个方向走:上,下,左,右。而初始的时候,我们是在起点S处,之后开始进行我们的搜索过程,也就是我们要讲的 DFS 算法。

那么当我们搜索到了某一个格子(也就是我们下一步会从该格子出发的时候):

1.首先要判断一下当前格子是否就是终点,如果是,那么就表示我们已经成功的从起点S移动了若干步之后到达了终点T,便成功地完成了这个问题。


2.否则我们就需要从该格子出发,可以分别枚举向左、向下、向右、向上四个方向,依次去判断它旁边的四个点是否可以作为下一步合法的目标点,如果可以,那么我们就进行这一步,走到目标点,然后继续进行操作。


3.当然有可能左、下、右、上四个点都无法再成为合法的目标点了,那么我们就回退一步,然后从上一步所在的那个格子向其他 未尝试的方向 继续枚举。

关于合法的定义如下:

必须在所给定的迷宫范围内。 如样例中是一个 4 行 3 列的迷宫,那么这个点必须在 (0,0)−(3,2) 的范围中才能称为合法,否则即为不合法。

这个点在搜索过程中必须没有被访问过。 也就是说,一个点在 DFS 的过程中只能被访问一次,不能重复访问。这样做是因为,如果一个点允许多次访问,那么肯定会出现死循环的情况——在两个点中间来回走。不过,根据题意,在某些情况下,你回溯了之后可以视回溯前的点为没有访问过。

这个点必须不是墙壁。这个显然很好理解,我们只能走在平地上,不能走在墙壁上也不能穿过墙壁。

DFS 走迷宫对应的伪代码框架如下:

// 对坐标为 (x, y) 的点进行搜索
bool dfs(int x, int y) {if (x, y) 是终点 {// 找到了路径return true;}// 标记 (x, y) 已经访问// 向上走到位置 (tx, ty)if (tx, ty) 合法 {if (dfs(tx, ty) == true) {// 递归调用 DFS 函数,将(tx, ty)作为当前状态进行搜索,下同。return true;}}// 向左走到位置 (tx, ty)if (tx, ty) /* 合法 */ {if (dfs(tx, ty) == true) {return true;}}// 向下走到位置 (tx, ty)if (tx, ty) /* 合法 */ {if (dfs(tx, ty) == true) {return true;}}// 向右走到位置 (tx, ty)if (tx, ty) /* 合法 */ {if (dfs(tx, ty) == true) {return true;}}return false;
}

迷宫搜索2(输出路径):

#include <iostream>
#include <string>
using namespace std;
int n, m;
string maze[110];
int sx, sy;
bool vis[110][110];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
bool in(int x, int y) {return 0 <= x && x < n && 0 <= y && y < m;
}
bool dfs(int x, int y) {vis[x][y] = true;if (maze[x][y] == 'T') {return true;}maze[x][y] = 'm';for (int i = 0; i < 4; i++) {int tx = x + dir[i][0];int ty = y + dir[i][1];if (in(tx, ty) && !vis[tx][ty] && maze[tx][ty] != '*') {if (dfs(tx, ty)) {return true;}}}maze[x][y] = '.';return false;
}
int main() {cin >> n >> m;for (int i = 0; i < n; i++) {cin >> maze[i];}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (maze[i][j] == 'S') {sx = i;sy = j;}}}if (dfs(sx, sy)) {cout << "Yes" << endl;} else {cout << "No" << endl;}for(int i = 0; i < n; i++){cout << maze[i] << endl;}return 0;
}

 

 

 

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

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

相关文章

Cocos Creator 3.x 实现触摸拖动物体(record)

参考&#xff1a;如何实现拖动物体 - Creator 3.x - Cocos中文社区 //注册触摸事件 node.on(Node.EventType.TOUCH_MOVE, this.onTouchMove, this); //事件回调函数 onTouchMove(event) {const location event.getUILocation();event.target.setWorldPosition(location.x, lo…

React渲染流程

在 React 渲染分为两个阶段&#xff0c;Render 和 Commit&#xff0c;Render 是修改 React 组件的状态&#xff0c;把需要更新的组件标记为待更新&#xff0c;在 Commit 阶段将待更新的组件进行渲染并最终更新到浏览器的 Dom 树中。 Render 阶段是可以并执行操作的&#xff0c…

JAVA定时创建mysql表

Java代码实现 Value("${timeTask.scheduled}")private boolean scheduled;// 提前创建3天的表Scheduled(cron "0 0 1 * * ?")public void createTable() {if (scheduled) {log.info("开始检验日志表");LocalDate localDate LocalDate.now();L…

探究AIGC行业:背景、现状与进入时机分析

人工智能与智能计算&#xff08;AIGC&#xff09;作为当今科技领域的热门话题&#xff0c;正在引起广泛关注。随着技术的不断进步和应用领域的拓展&#xff0c;AIGC行业正迎来新的发展机遇。本文将从AIGC产生的背景、现状以及当前进入行业的时机三个方面进行分析&#xff0c;旨…

软件测试常见面试题合集(内附详细答案)

01 软件测试理论部分 1.1 测试概念 1. 请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试&#xff1a;完成最小的软件设计单元&#xff08;模块&#xff09;的验证工作&#xff0c;目标是确保模块被正确的编码 集成测试&#xff1a;通过测试发现与…

知识蒸馏详解

1.概述 知识蒸馏,其核心在于如何让一个小型、资源友好的模型(学生模型)通过学习一个庞大、性能优越但资源消耗大的模型(教师模型)的知识,从而在保持较小规模的同时,接近或达到教师模型的预测能力。这一过程就如同聪明的学生从优秀老师那里不仅学习到知识的精髓,还能借鉴…

猛兽派对是什么游戏 猛兽派对攻略大全 苹果电脑怎么玩《猛兽派对》?

猛兽派对是多人派对类型的游戏&#xff0c;该款游戏的动作基于物理原理设计的&#xff0c;体验游戏玩家可以选择自己喜欢的小动物角色参加派对&#xff0c;游戏内具有很多不同的关卡可供挑战。 在steam平台上&#xff0c;猛兽派对对应英文名称是PartyAnimals&#xff0c;官方正…

JVM内存模型最新面试题(持续更新)

问题&#xff1a;java中创建的对象一般放在哪里&#xff1f;(全流程包含从创建到回收) 回答 大部分对象在堆中&#xff0c;这个基本都知道&#xff1b; 少部分对象是会在栈中的&#xff0c;比如作用域不局限于方法内的方法内部变量&#xff0c;这类对象的特征一般就是生命周期…

Flutter 中的 Divider 小部件:全面指南

Flutter 中的 Divider 小部件&#xff1a;全面指南 在用户界面设计中&#xff0c;分隔线&#xff08;Divider&#xff09;是一种常用的视觉元素&#xff0c;用于区分内容、组织布局和提高可读性。在 Flutter 框架中&#xff0c;Divider 小部件提供了一种简单而有效的方式来添加…

opencv4.8.0 GPU版本各平台编译

一、opencv4.8.0 ubuntu22.04上编译&#xff1a; 用cmake进行编译,需要配置三次。选中world选项&#xff0c;输入opencv_contrib_module路径。 ubuntu22.04上编译&#xff1a; cmake \ -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D BUILD_opencv_p…

《IT行业的未来:趋势与展望》

当前&#xff0c;IT行业呈现出许多显著的趋势和特征&#xff1a; 1. **数字化转型&#xff1a;** 许多行业正在积极进行数字化转型&#xff0c;采用云计算、大数据分析、人工智能等技术来提高效率、降低成本&#xff0c;并创造新的商业模式和服务。 2. **人工智能的普及&…

开发指南023-生成参赛证

赛事平台业务上需要生成参赛证或奖状&#xff0c;平台采用定义PDF模板&#xff0c;使用ITEXT操作PDF文件&#xff0c;使用信息填充的技术路线。其中最核心的函数是&#xff1a; <groupId>org.qlm</groupId> <artifactId>qlm-utils-pdf</artifactId> &…

Gorm_快速入门

快速入门 gorm地址&#xff1a;https://github.com/go-gorm/gorm 对开发者友好的gorm库&#xff0c;目前使用最广的go orm库之一 1. 准备工作 数据库以目前使用最多的mysql为例。 //安装MySQL驱动 go get -u gorm.io/driver/mysql //安装gorm包 go get -u gorm.io/gorm //…

免费公有云轻量级云服务,支持免费云数据库和创建应用,支持多语言应用!

在今天这个数字化迅速发展的时代&#xff0c;选择一个高效、经济且功能全面的云平台对于任何大小的企业来说都是至关重要的。MemFire Cloud 作为市场上新兴的星级云服务提供商&#xff0c;以其免费的公有云服务和对多种编程语言的支持&#xff0c;提供了一站式解决方案&#xf…

【C++】类和对象终章 --内部类和匿名对象,再识类和对象

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a; 类和对象终章 --内部类和匿名对象&#xff0c;再识类和对象 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux …

51单片机超声波测距_液位检测_温度检测原理图PCB仿真代码

目录 实物图&#xff1a; PCB ​原理图​ 仿真图 ​编辑 程序 资料下载地址&#xff1a;51单片机超声波测距-液位检测-温度检测原理图PCB仿真代码 主控为stc89c52,通过ds18b20进行温度采集&#xff0c;超声波测距&#xff0c;距离不可以超过1m&#xff0c;通过按键可以设…

CAD插入文字到另一图形样式变相同

CAD从一张图形复制到另外一张图形后&#xff0c;文字样式变成一样是因为两张图所用的文字样式名称一样&#xff0c;但是样式里面的使用字体样式不一样。如下图所示&#xff0c;找到工具栏中的注释 &#xff0c;点击文字样式。里面就会显示当前图形中使用的样式名称及其对应的字…

拓扑排序板子

经过一晚上的不懈努力,创造出了一个很烂的拓扑排序的板子 这是精简版 using ll long long; struct tsort {int n;std::vector<std::vector<int>>g, w;std::vector<int>r, c, dp,f;std::queue<int>q;tsort(int n_) {n n_;g.resize(n 1);w.resize(…

Java内存详解

内存区域、内存模型 内存区域&#xff1a;即运行时数据区域&#xff0c;指JVM对于不同类型数据在内存中的存储方式内存模型&#xff08;JMM&#xff1a;Java Memory Model&#xff09;&#xff1a;定义了线程与主内存之间的抽象关系&#xff0c;即JVM在内存中的工作方式&#…

微信小程序如何使用weui组件库?

一、方法一&#xff1a;通过npm安装 通过npm构建方式引入weui组件库 &#xff08;找到.eslintrc.js 右键&#xff0c;在内件终端打开&#xff09;打开命令提示符后&#xff0c;输入 &#xff08;1&#xff09;npm init -y来快速生成一个默认的package.json文件 &#xff08;…