1. #include <iostream>
  2. #include <iomanip>
  3. #include <cstdlib>
  4. using namespace std;
  5.  
  6. #define MaxSize 100
  7. int maze[10][10] = //定义一个迷宫,0表示通道,1表示墙
  8. {
  9. {1,1,1,1,1,1,1,1,1,1},
  10. {1,0,0,1,1,0,0,1,0,1},
  11. {1,0,0,1,0,0,0,1,0,1},
  12. {1,0,0,0,0,1,1,0,0,1},
  13. {1,0,1,1,1,0,0,0,0,1},
  14. {1,0,0,0,1,0,0,0,0,1},
  15. {1,0,1,0,0,0,1,0,0,1},
  16. {1,0,1,1,1,0,1,1,0,1},
  17. {1,1,0,0,0,0,0,0,0,1},
  18. {1,1,1,1,1,1,1,1,1,1}
  19. };
  20.  
  21. struct Try //定义一个栈,保存路径
  22. {
  23. int i; //当前方块的行号
  24. int j; //当前广场的列号
  25. int d; //di是下一可走方位的方位号
  26. } path[MaxSize]; //定义栈
  27.  
  28. int top = -1; //初始化栈指针
  29.  
  30. void findPath(int xb, int yb, int xe, int ye) //路径为从(xb,yb)到(xe,ye)
  31. {
  32. int i, j, d, find, k;
  33. top++; //初始方块进栈
  34. path[top].i = xb;
  35. path[top].j = yb;
  36. path[top].d = -1;
  37. maze[xb][yb] = -1;
  38. while(top>-1) //栈不为空时循环
  39. {
  40. i = path[top].i;
  41. j = path[top].j;
  42. d = path[top].d;
  43. if(i==xe && j==ye) //找到了出口,输出路径
  44. {
  45. cout << "迷宫路径如下:\n";
  46. for(k=0; k<=top; k++)
  47. {
  48. cout << "\t(" << path[k].i << "," << path[k].j << ")";
  49. if((k+1)%5==0) cout << endl; //每输出五个方块后换一行
  50. }
  51. cout << endl;
  52. return;
  53. }
  54. find = 0;
  55. while(d<4 && find==0) //找下一个可走的点
  56. {
  57. d++;
  58. switch(d)
  59. {
  60. case 0: //向上
  61. i = path[top].i-1;
  62. j = path[top].j;
  63. break;
  64. case 1: //向右
  65. i = path[top].i;
  66. j = path[top].j+1;
  67. break;
  68. case 2: //向下
  69. i = path[top].i+1;
  70. j = path[top].j;
  71. break;
  72. case 3: //向左
  73. i = path[top].i;
  74. j = path[top].j-1;
  75. break;
  76. }
  77. if(maze[i][j]==0) find = 1; //找到通路
  78. }
  79. if(find==1) //找到了下一个可走方块
  80. {
  81. path[top].d = d; //修改原栈顶元素的d值
  82. top++; //下一个可走方块进栈
  83. path[top].i = i;
  84. path[top].j = j;
  85. path[top].d = -1;
  86. maze[i][j] = -1; //避免重复走到这个方块
  87. //cout << "\t(" << path[top].i << "," << path[top].j << ")"; //显示经过的试探
  88. }
  89. else //没有路可走,则退栈
  90. {
  91. maze[path[top].i][path[top].j] = 0; //让该位置变成其它路径可走方块
  92. top--;
  93. }
  94. }
  95. cout << "没有可走路径!\n";
  96. }
  97.  
  98. int main()
  99. {
  100. findPath(1,1,8,8); //从(1,1)入,(8,8)出
  101. return 0;
  102. }

  

C++回溯法走迷宫的更多相关文章

  1. python 回溯法 子集树模板 系列 —— 2、迷宫问题

    问题 给定一个迷宫,入口已知.问是否有路径从入口到出口,若有则输出一条这样的路径.注意移动可以从上.下.左.右.上左.上右.下左.下右八个方向进行.迷宫输入0表示可走,输入1表示墙.为方便起见,用1将 ...

  2. 算法之--回溯法-迷宫问题【python实现】

    题目描述 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0,  ...

  3. C语言递归回溯法迷宫求解

    本例将随机产生一个10*10的迷宫输出后,在下面输出此迷宫的解法. 解法为从坐标(1,1)处进入,从(8,8,)出去,优先线路为先右后下再上最后为左. 不少人求解此题时运用的栈的相关知识,本例寻找线路 ...

  4. P1605 迷宫 dfs回溯法

    题目背景 迷宫 [问题描述] 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过.给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案.在迷宫 中移动有上下 ...

  5. 回溯法求解n皇后和迷宫问题

    回溯法是一种搜索算法,从某一起点出发按一定规则探索,当试探不符合条件时则返回上一步重新探索,直到搜索出所求的路径. 回溯法所求的解可以看做解向量(n皇后坐标组成的向量,迷宫路径点组成的向量等),所有解 ...

  6. 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)

    1. 题目描述 /* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. 如果一条 ...

  7. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  8. python 回溯法 子集树模板 系列 —— 18、马踏棋盘

    问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方格,要求每个方格进入且只进入一次,找出一种可行的方案. 分析 说明:这个图是5*5的棋盘. 图片来 ...

  9. python 回溯法 记录

    一直不是太理解回溯法,这几天集中学习了一下,记录如下. 回溯法有"通用的解题法"之称. 1.定义:  也叫试探法,它是一种系统地搜索问题的解的方法. 2.基本思想:  从一条路往前 ...

随机推荐

  1. httpd 安装

    官网地址:http://httpd.apache.org/docs/2.4/ Download Download the latest release from http://httpd.apache ...

  2. JAVA实现国际化

    1 Java国际化的思路 Java程序的国际化的思路是将程序中的标签.提示等信息放在资源文件中,程序需要支持哪些国家.语言环境,就对应提供相应的资源文件.资源文件是key-value对,每个资源文件中 ...

  3. 一个jQ版大图滚动

    难得周末能休息,也是越发的代码难受,手就想敲点东西,这不闲着无聊敲了一个Jq版的大图滚动,不足之处大家批评指正: 运作环境win7,代码编辑器是:sublime; 我把源码复制了一下, <!do ...

  4. Mac OSX上的软件包管理工具,brew 即 Homebrew

    brew 即 Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件, 只需要一个命令, 非常方便. brew类似ubuntu系统下的apt-get的功能. 安装 ...

  5. Mac 快捷键

    总结一下: Ctrl + 关机:弹出关机提示 Ctrl + Opt + 关机 : 正常关机快捷键 Cmd + Opt + 关机 :休眠 Ctrl + Cmd + 关机:重启 Shift + Ctrl ...

  6. python之RabbitMQ

    一.安装RabbitMQ 1. 安装erlang 1 2 3 4 tar xf otp_src_18.3.tar.gz cd otp_src_18.3 ./configure --prefix=/ma ...

  7. ProcessBuilder 、Runtime和Process 的区别

    1.版本原因 ProcessBuilder是从java1.5加进来的,而exec系列方法是从1.0开始就有的,后续版本不断的重载这个方法,到了1.5已经有6个之多. 2.ProcessBuilder. ...

  8. jQuery学习笔记(三)jQuery中的事件

    目录 加载DOM 事件绑定 合成事件 事件冒泡 移除事件 一.加载DOM Javascript 与HTML之间的交互是通过用户操作浏览器页面引发的事件来处理的.jQuery提供了丰富的事件处理机制.从 ...

  9. mysql查看修改字符集

    1.列出MYSQL支持的所有字符集: SHOW CHARACTER SET; 2.当前MYSQL服务器字符集设置 SHOW VARIABLES LIKE 'character_set_%'; 3.当前 ...

  10. I2S/PCM/IOM-2、I2C/SPI/UART/GPIO/slimbus

    概述 I2S,PCM,IOM-2都是数字音频接口,传数据的. I2C,SPI,UART,GPIO是控制接口,传控制信令的. I2S I2S(Inter-IC Sound Bus)是飞利浦公司为数字音频 ...