(DFS)迷宫问题

题目:

从s到t,.意味着可以走,*意味着不能走,如果能走,输出路径,如果不能走,输出no
输入:

5 6
....S*
.***..
.*..*.
*.***.
.T....

输出:

....m*                                                                        
.***mm                                                                        
.*..*m                                                                        
*.***m                                                                        
.Tmmmm  

分析与解答

1.整体思路:
我们先从第一个走的,因此先把第一个格子标记为已走过,然后开始走第一个格子上下左右的相邻格子,如果这个相邻格子没走过,而且从这个相邻格子能走到下一个格子,那么就可以一直走下去,继续调用dfs。

当调用dfs直到无法走下一个格子,这时直接返回false,然后回到上一个格子,直到返回到最开始的那个格子,此时最开始的格子走另一个方向的格子。然后继续重复之前的调用,直到找到终点。

2.推广到dfs的研究方法:
1.处理搜索结束时的边界条件

2.搜索:我们判断是否能继续往下搜,需要满足下一个方向的坐标在地图里面,而且没有被走过,而且没遇到墙。如果满足这些条件,就再调用dfs,继续往下搜。

3.回溯:当所有方向都搜完,也没找到路径,此时函数运行结束,这一层返回false,返回上一层的递归。返回之前,我们需要把访问时做的标记还原。返回上一层有可能就是改变方向继续进行新的搜索,直到达到边界条件。

如果说最后到了边界条件,那么底层的返回true,然后依次往上全部返回true,这样dfs(x,y)就返回true。就说明从起始点xy走是可以到终点的。

如果说一直都没有到边界条件,那么也就是说我们一开始把起始点设定为已经走过的点,然后上下左右搜索最后全部都回来了,此时第一层中那几个if都用完了,于是就继续往下走,也就是说,把起始的那个格子给初始化,并且返回false。

3.代码的简洁性:

然后由四个方向搜索,我们可以发现它有四个一摸一样的if,只不过每次的x和y的值有所不同,那么我们就可以引入一个方向变量,int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}}; 这样的话,我们就可以通过for循环和方向变量实现每次对xy的值的修改,然后再把if写道for里面,这样就不用把四个方向分开写了,简化了代码量。

代码

#include <iostream>
#include <string>
using namespace std;
int n, m;
string maze[110];
bool vis[110][110];
bool in(int x,int y){//防止走到地图外面return 0<=x&&x<n&&0<=y&&y<m;
}
bool dfs(int x,int y){//x代表行,y代表列if(maze[x][y]=='T'){return true;}vis[x][y]=1;//标记当前点已走过maze[x][y]='m';//走过的点用字符m标记int tx = x-1,ty=y;//向上搜if(in(tx,ty)&&maze[tx][ty]!='*'&&!vis[tx][ty]){if(dfs(tx,ty)){return true;}}tx=x,ty=y-1;//左if(in(tx,ty)&&maze[tx][ty]!='*'&&!vis[tx][ty]){if(dfs(tx,ty)){return true;}}tx=x+1,ty=y;//下if(in(tx,ty)&&maze[tx][ty]!='*'&&!vis[tx][ty]){if(dfs(tx,ty)){return true;}}tx=x,ty=y+1;//右if(in(tx,ty)&&maze[tx][ty]!='*'&&!vis[tx][ty]){if(dfs(tx,ty)){return true;}}vis[x][y]=0;maze[x][y]='.';return false;
}
int main() {// 输入迷宫地图cin >> n >> m;for (int i = 0; i < n; i++) {cin >> maze[i];}int x,y;//确定起始位置for(int i=0;i<n;++i){for(int j=0;j<m;++j){if(maze[i][j]=='S'){x=i,y=j;}}}if(dfs(x,y)){for(int i=0;i<n;++i){cout<<maze[i]<<endl;}}else{cout<<"NO!"<<endl;}return 0;
}

用二维数组将上下左右搜索整合到一个for循环里。

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

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

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

相关文章

惠普z6计算机进不去桌面,HP Z6 桌面工作站 | HP® HK 惠普香港

Intel、Thunderbolt 及 Xeon 均為 Intel Corporation 於美國及/或其他國家或地區的商標。Microsoft 及 Windows 為 Microsoft Corporation 於美國及/或其他國家或地區的註冊商標或商標。NVIDIA 是 NVIDIA Corporation 在美國及其他國家或地區的商標及/或註冊商標。USB Type-C™…

mysql定义条件和处理_mysql sql存储过程条件定义与处理

一、条件定义DECLARE condition_name CONDITION FOR condition_valecondition_value:sqlstate[value] sqldata_value |mysql教程_error_code二、条件处理DECLARE htype HANDLER FOR cond_value[...] sp_statementhandtype_value:sqlstate [value] saltate_value|contentname|sq…

(DFS)跳马

题目&#xff1a; 马走日&#xff0c;不考虑别马脚&#xff0c;问马能否从S走到T&#xff0c;其中‘#’表示不能落下&#xff0c;‘.’表示能落下 输入&#xff1a; .#....#S# ..#.#.#.. ..##.#..# ......##. ...T..... ...#.#... ...#..... ...###... ......... .##......输…

长沙医学院学位计算机考试内容,湖南长沙医学院2017年9月计算机等级考试报名时间...

长沙医学院2017年下半年第49次全国计算机等级考试(以下简称NCRE)将于2017年9月23至25日举行。为做好本次考试报名及相关考务工作&#xff0c;现将有关事项通知如下&#xff1a;一、报名时间&#xff1a;2016年6月7日—2016年6月18日&#xff0c;逾期不接受任何理由的补报名。二…

(递推)常用递推式总结及实现

常用递推式 后面问题的解可以由前面问题的解递推而来&#xff0c;每一项都与前面若干项有一定关联。它是一种用若干步可以重复的简单运算来描述复杂问题的方法。 爬楼梯和兔子问题和斐波那契&#xff1a;f(n)f(n−1)f(n−2);f(1)1,f(2)1f(n)f(n-1)f(n-2) ; f(1)1,f(2)1 f(n)f…

mysql建表语句utf-8_mysql 创建utf-8数据集

之前数据库都是默认的‘latin1 ’&#xff0c;由于业务需求&#xff0c;需要把数据集修改为utf-8(1)创建一个新的数据库&#xff0c;并设置默认的格式为utf-8CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;(2) 将这个yourdbname 数据…

html读取servlet,简单html与servlet交互(HTML利用servlet读取txt)

1.usercheck.htmlhref"../lib/ligerUI/skins/Aqua/css/usertext.css" rel"stylesheet"type"text/css" />填写用户名/>id"verifyButton"/>>2.usertext.css.userClass {border: 1px solid red ;background-image:url(../../…

mysql dnslog_dnslog小技巧

一、dnslog利用场景主要针对无回显的情况。Sql-BlindRCESSRFRFI(Remote File Inclusion)二、原理将dnslog平台中的特有字段payload带入目标发起dns请求&#xff0c;通过dns解析将请求后的关键信息组合成新的三级域名带出&#xff0c;在ns服务器的dns日志中显示出来。三、案例展…

卷积积分

文章目录卷积积分信号的时域分解卷积公式卷积积分定义卷积积分图解法&#xff1a;卷积的性质&#xff1a;常用卷积重要公式卷积求解方法用梳状函数卷积产生周期信号矩形脉冲的卷积产生三角形和梯形脉冲自相关互相关函数定义相关与卷积卷积积分 本质&#xff1a;信号分解 f(t)…

2019哈佛计算机专业录取,2019哈佛大学早申请录取数据公布 录取率再降1个点仅为13.4%...

出结果了&#xff0c;出结果了&#xff0c;作为美国在全球范围内最负盛名的哈佛大学&#xff0c;与近日公布2019美国本科申请提前录取的相关数据。今年哈佛大学本科学院向6,968位在2023届提前录取轮次申请人中的935位发出了录取通知&#xff0c;申请录取率约为13.4%&#xff0c…

mysql master 监控_可用于监控 mysql Master Slave 状态的python代码

代码如下:import osimport sysimport MySQLdbdef getStatus(conn):query ” SHOW SLAVE STATUS “# print querycursor conn.cursor()cursor.execute(query)result cursor.fetchall()return result[0]def resolve(conn):cursor conn.cursor()query1 “set global sql_slav…

python类和oop基础知识

文章目录oop:面向对象程序设计python类的特点&#xff1a;oop基本概念&#xff1a;1.属性继承搜索:2.类和实例&#xff1a;3.类方法调用4.编写类树5.代码重用oop:面向对象程序设计 1.类&#xff1a;一些函数的包&#xff0c;这些函数大量使用并处理内置对象类型。 2.类的设计…

计算机语言中tc是什么,新人必须了解的几个TC常用语和脚本基础知识!

基础知识TC常用语一,函数在百度百科中是这样解释函数的:函数(function)表示每个输入值对应唯一输出值的一种对应关系。在计算机定义中函数过程中的这些语句用于完成某些有意义的工作——通常是处理文本&#xff0c;控制输入或计算数值。通过在程序代码中引入函数名称和所需的参…

mysql中pi是什么意思_MySQL 基础知识与常用命令

MySQLMySQL是一种开放源代码的关系型数据库管理系统(RDBMS)&#xff0c;MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。MySQL在过去由于性能高、成本低、可靠性好&#xff0c;已经成为最流行的开源数据库&#xff0c;因此被广泛地应用在Inte…

科幻计算机类小说,短篇科幻小说推荐 | 黄金时代的五部科幻杰作

编注&#xff1a;本文是少数派读书月「我读过的好书」征文活动的入围文章。本文仅代表作者本人观点&#xff0c;少数派对标题和排版略作调整。想了解如何参与本次读书征文&#xff0c;赢取各种丰厚奖品&#xff0c;你可以 点此查看 活动规则和奖品清单。文章包含五个故事的情节…

数据结构:单链表

文章目录链表&#xff1a;单链表的实现及操作&#xff1a;1.指针描述的单链表L存储结构2.查找L的第i个元素&#xff0c;将其值赋值给e3.在L的第i个位置之前插入元素e4.在L中&#xff0c;删除第i个元素&#xff0c;并返回其值e5.输入n个元素&#xff0c;建立带头节点的单链表L6.…

mysql离散查询_如何写出高性能的MySQL查询

作者&#xff1a;会写代码的猪 发布时间&#xff1a;December 25, 2009 分类&#xff1a;猪在写代码想写这样一篇文章很久了&#xff0c;但始终没有下手。最近帮同事看了几个查询&#xff0c;而且自己也在考虑一个索引系统的问题&#xff0c;所以今天就把这个写了。介绍一下MyS…

计算机中丢失msc,mscvr120.dll32位/64位版_修复计算机中丢失msvcr120.dll

mscvr120.dll32位/64位版_修复计算机中丢失msvcr120.dllmscvr120.dll是系统的非常重要的一个文件&#xff0c;相信很多的人都是遇到文件丢失的情况&#xff0c;这个时候就需要你在下载一个dll文件使用了&#xff01;现在就为大家提供最新的dll文件下载&#xff0c;需要的可以看…

mysql解压缩版配置_MySQL 5.6 for Windows 解压缩版配置安装

1、MySQL安装文件分为两种&#xff0c;一种是msi格式的&#xff0c;一种是zip格式的。如果是msi格式的可以直接点击安装&#xff0c;按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示)&#xff0c;一般MySQL将会安装在C:\Program Files\MySQL\MySQL Server 5.6 该…

数据结构:顺序栈

文章目录栈&#xff1a;顺序栈的实现及操作&#xff1a;1.定义一个栈2.构造一个空栈3.取栈顶元素4.插入元素e5.删除栈顶元素&#xff0c;返回其值6.清空栈&#xff0c;销毁栈栈的操作实例及代码&#xff1a;栈&#xff1a; 从数据结构上来看&#xff0c;栈也是线性表&#xff…