例题:走迷宫

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;}//四个方向依次访问;两串代码本质没有区别,时间复杂度没有区别;之后可以减枝优化搜索

深度优先搜索—走迷宫相关推荐

  1. 深度优先搜索——走迷宫问题

    题目大意: 用二维数组存储一个n * m的迷宫,0表示路,1表示墙.一个人位于左上角 (1,1)(1,1) 处,已知该人每次可以向上.下.左.右任意一个方向移动一个位置,求从左上角移动到右下角的最少次 ...

  2. 深度优先搜索找迷宫的出路

    3. 深度优先搜索 现在我们用堆栈解决一个有意思的问题,定义一个二维数组: int maze[5][5] = {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, ...

  3. Qt利用深度优先搜索实现迷宫寻宝

    先看效果: 利用QT搭建迷宫界面 利用单选框来构造迷宫,设置障碍物和宝藏的位置 利用深度优先搜索实现迷宫寻宝,并且在寻找的过程中避开障碍物. 搜索算法在线程中进行 定义方格的属性 enum Signa ...

  4. 打印数组算法:堆栈与深度优先搜索(迷宫问题)

    每日一贴,今天的内容关键字为打印数组 栈堆的拜访规矩被制约为Push和Pop两种作操,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则掏出前当栈顶的元素,也就是说,只能拜访栈顶元素而不能拜 ...

  5. 基于A*搜索和深度优先搜索解迷宫问题

    摘 要 迷宫问题是指能够从起始点寻找一条通往目标点的路径,迷宫的传统搜索是采用深度优先和宽度优先搜索,虽然也能够解决迷宫的求解问题,但是这些方法效率比较低.我们已经知道深度优先和广度优先搜索归于为盲目 ...

  6. Ali and Snoopy(利用广度搜索走迷宫)

    Judge Info Memory Limit: 32768KB Case Time Limit: 1000MS Time Limit: 1000MS Judger: Number Only Judg ...

  7. 《啊哈算法》 解救小哈(深度优先算法——走迷宫实战) P86

    #include <stdio.h>int n, m, p, q, min=999999; //n和m分别为行和列, p和q分别为终点的x,y坐标, min是最小步数 int a[51][ ...

  8. 用深度优先搜索解迷宫问题

    定义一个二维数组: 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, } ...

  9. DFS(深度优先搜索)---迷宫(洛谷)----SCAU_LEO

    一.题目 题目链接:迷宫 首先,今天是1月2日,虽然有点晚了,但是还是祝大家新的一年快快乐乐,开开心心,题题AC,场场拿金,! 说说我对迷宫类题目的感受,我记得刚开始学迷宫的时候,不是看的很懂,但是睡 ...

最新文章

  1. wordpress jquery加载如何实现?
  2. JavaScript函数实现方式大总结
  3. LeetCode 1122 数组的相对排序-简单-unordered_map容器的应用
  4. BlackBerry 开发笔记入门 J2ME
  5. 【李宏毅机器学习】Convolutiona Neural Network 卷积神经网络(p17) 学习笔记
  6. 计算机应用技术高数挂科,这7个专业难度太大,挂科率很高,只有学神才敢报考...
  7. HTTP协议和HTTPS协议
  8. 计算机显卡驱动不匹配,显卡驱动不兼容怎么办 显卡驱动降低旧版本方法
  9. C语言作业解决,c语言作业9
  10. H5跳转微信公众号解决方案
  11. vue ssr搭建服务端渲染项目
  12. 我是如何设计一个包办所有对企政策的城市平台
  13. python支持的编程方式包括,python的两种编程方式是什么
  14. IT培训机构怎么样?IT培训机构推荐
  15. 古文摘抄(持续不定时更新)
  16. 交换机模拟配置软件_GNS3 for mac(网络模拟工具)
  17. 机器人坐标系基本概念
  18. win爬取网址获取宵宫语音,使用python的selenium库来模拟点击
  19. LabVIEWCompactRIO 开发指南6
  20. 联想童夫尧:韬光养晦、空中换引擎,加速企业级市场增长

热门文章

  1. python字符分割垂直投影法_Python实现投影法分割图像示例(一)
  2. 【CuteJavaScript】GraphQL真香入门教程
  3. 学 Python 的乐园,坚持一年,值了!
  4. 15ubuntu20.04离线安装openssh8.9.p1
  5. 最新ONE兔V3.0版/婚恋/交友/社交APP三端源码
  6. title显示不全的处理方法
  7. excel粘贴 粘贴值 使用VBA宏匹配目标格式
  8. 微信小程序根据sourceMap 定位代码错误位置
  9. 用一个二维码做下载app,自动区分是 ios 还是 android
  10. 像素单位(px pt rem em rpx)