深度优先搜索—走迷宫
例题:走迷宫
1.需要一个终止条件,
2.需要四个搜索方向:上下左右;
3.并且需要使用bool进行标记一个方向是否访问过;
4.如果需要找到多个可行解,那么如果该方向可行,需要取消标记。如果只需要也给可行解,则不需要取消标记
问题描述
有一个二维迷宫,n行m列,‘s’表示迷宫的起点,‘T’表示迷宫的终点,‘#’表示围墙,‘.’表示通路。
现在从S出发,找出路径,并且打印出来
输入格式
第一行输入n,m(1<=n,m<=10)表示迷宫的行列大小。
接下来输入n行字符串表示迷宫。
输出格式
一个整数,表示走出迷宫的方法数
样例输入1
5 6....S*.***...*..*.*.***..T....
样例输出1
....m*.***mm.*..*m*.***m.Tmmmm
思路
可以用深度优先搜索(递归思想)来解决,从起点出发,下一个点只有四个方向,如果遇墙就结束,如果遇点就前进并标记(搜索完该支路后消除标记,供后面搜索判断),直到遇到‘T’,
AC代码:
#include<iostream>using namespace std;int n, m;char maze[110][110];bool vis[110][110];bool in(int x, int y) {return 0 <= x && x < n && 0 <= y && y < m;//n和m分别为输入的边界;}bool dfs(int x, int y) {int n, m;//结束条件:找到终点Tif (maze[x][y] == 'T') {return true;}vis[x][y] = true;//表示这个地方已经走过了;maze[x][y] = 'm';//表示路径int tx = x, ty = y - 1;//定义一个初始访问方向,向上走;从终点寻找起点//向上走if (in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty]) {//判断1.访问区域在迷宫类,2.访问的地方不是障碍*,3.判断这个地方没有被访问过;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;}tx = x + 1;ty = y;//向右走;if (in(tx, ty) && maze[tx][ty] != '*' && !vis[tx][ty]) {if (dfs(tx, ty)) return true;}vis[x][y] = false;//失败则标记一下;maze[x][y] = '.';//之前设置为了m,现在还原,表示这里不是通往终点的路return false;}int main() {cin >> m >> n;//m为行,n为每行有几个for (int i = 0;i < m;i++) {for (int j = 0;j < n;j++) {cin >> maze[j][i];}}int x, y;//找到起点坐标for (int i = 0;i < m;i++) {for (int j = 0;j < n;j++) {if (maze[j][i] == 'S')x = j,y = i;}}if (dfs(x, y)) {for (int i = 0;i < m;i++) {for (int j = 0;j < n;j++) {cout << maze[j][i];}cout << endl;}}else cout << "NO!" << endl;}
优化:
把四个方向,写出一种循环,用二维数组表示方向;并且再加个取模即可
int dir[4] [2]={{0,-1},{-1,0},{0,1},{1,0}}分别表示上左下右;方向用逆时针;
四组数据,每组两个数据;每组第一个表示x(对应下标为0),第二个表示y(对应下标为1)
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;}//四个方向依次访问;两串代码本质没有区别,时间复杂度没有区别;之后可以减枝优化搜索
深度优先搜索—走迷宫相关推荐
- 深度优先搜索——走迷宫问题
题目大意: 用二维数组存储一个n * m的迷宫,0表示路,1表示墙.一个人位于左上角 (1,1)(1,1) 处,已知该人每次可以向上.下.左.右任意一个方向移动一个位置,求从左上角移动到右下角的最少次 ...
- 深度优先搜索找迷宫的出路
3. 深度优先搜索 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, ...
- Qt利用深度优先搜索实现迷宫寻宝
先看效果: 利用QT搭建迷宫界面 利用单选框来构造迷宫,设置障碍物和宝藏的位置 利用深度优先搜索实现迷宫寻宝,并且在寻找的过程中避开障碍物. 搜索算法在线程中进行 定义方格的属性 enum Signa ...
- 打印数组算法:堆栈与深度优先搜索(迷宫问题)
每日一贴,今天的内容关键字为打印数组 栈堆的拜访规矩被制约为Push和Pop两种作操,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则掏出前当栈顶的元素,也就是说,只能拜访栈顶元素而不能拜 ...
- 基于A*搜索和深度优先搜索解迷宫问题
摘 要 迷宫问题是指能够从起始点寻找一条通往目标点的路径,迷宫的传统搜索是采用深度优先和宽度优先搜索,虽然也能够解决迷宫的求解问题,但是这些方法效率比较低.我们已经知道深度优先和广度优先搜索归于为盲目 ...
- Ali and Snoopy(利用广度搜索走迷宫)
Judge Info Memory Limit: 32768KB Case Time Limit: 1000MS Time Limit: 1000MS Judger: Number Only Judg ...
- 《啊哈算法》 解救小哈(深度优先算法——走迷宫实战) P86
#include <stdio.h>int n, m, p, q, min=999999; //n和m分别为行和列, p和q分别为终点的x,y坐标, min是最小步数 int a[51][ ...
- 用深度优先搜索解迷宫问题
定义一个二维数组: int maze[5][5] = {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, } ...
- DFS(深度优先搜索)---迷宫(洛谷)----SCAU_LEO
一.题目 题目链接:迷宫 首先,今天是1月2日,虽然有点晚了,但是还是祝大家新的一年快快乐乐,开开心心,题题AC,场场拿金,! 说说我对迷宫类题目的感受,我记得刚开始学迷宫的时候,不是看的很懂,但是睡 ...
最新文章
- wordpress jquery加载如何实现?
- JavaScript函数实现方式大总结
- LeetCode 1122 数组的相对排序-简单-unordered_map容器的应用
- BlackBerry 开发笔记入门 J2ME
- 【李宏毅机器学习】Convolutiona Neural Network 卷积神经网络(p17) 学习笔记
- 计算机应用技术高数挂科,这7个专业难度太大,挂科率很高,只有学神才敢报考...
- HTTP协议和HTTPS协议
- 计算机显卡驱动不匹配,显卡驱动不兼容怎么办 显卡驱动降低旧版本方法
- C语言作业解决,c语言作业9
- H5跳转微信公众号解决方案
- vue ssr搭建服务端渲染项目
- 我是如何设计一个包办所有对企政策的城市平台
- python支持的编程方式包括,python的两种编程方式是什么
- IT培训机构怎么样?IT培训机构推荐
- 古文摘抄(持续不定时更新)
- 交换机模拟配置软件_GNS3 for mac(网络模拟工具)
- 机器人坐标系基本概念
- win爬取网址获取宵宫语音,使用python的selenium库来模拟点击
- LabVIEWCompactRIO 开发指南6
- 联想童夫尧:韬光养晦、空中换引擎,加速企业级市场增长
热门文章
- python字符分割垂直投影法_Python实现投影法分割图像示例(一)
- 【CuteJavaScript】GraphQL真香入门教程
- 学 Python 的乐园,坚持一年,值了!
- 15ubuntu20.04离线安装openssh8.9.p1
- 最新ONE兔V3.0版/婚恋/交友/社交APP三端源码
- title显示不全的处理方法
- excel粘贴 粘贴值 使用VBA宏匹配目标格式
- 微信小程序根据sourceMap 定位代码错误位置
- 用一个二维码做下载app,自动区分是 ios 还是 android
- 像素单位(px pt rem em rpx)