问题描述:给定一个最基本的迷宫图,用一个数组表示,值0表示有路,1表示有障碍物,找一条,从矩阵的左上角,到右下角的最短路。求最短路,大家最先想到的可能是用BFS求,本文也是BFS求最短路的。

源代码如下:

  1. /*
  2. 使用BFS解决迷宫问题
  3.  
  4. **/
  5. #include<iostream>
  6. #include<queue>
  7. #include<vector>
  8. using namespace std;
  9. struct MaNode{
  10. int x;
  11. int y;
  12. MaNode *pre;
  13. MaNode(int x1=,int y1=,MaNode *p =NULL ):x(x1),y(y1),pre(p)
  14. {
  15. }
  16. };
  17. const int maxr=;
  18. const int maxc=;
  19. queue<MaNode*> qmaze;
  20. vector<MaNode*> vemaze; //保存节点,以便释放
  21.  
  22. int maze[maxr][maxc] = {
  23. ,,,,,
  24. ,,,,,
  25. ,,,,,
  26. ,,,,,
  27. ,,,,,
  28. };
  29. void visit(int x,int y, MaNode *p ) //访问节点
  30. {
  31. struct MaNode *p2 = new MaNode(x,y,p);
  32. //p2->x = x;
  33. //p2->y =y;
  34. // p2->pre = p;
  35. maze[x][y] = ; //标识已经访问
  36. qmaze.push(p2);
  37. }
  38. void bfs() // 宽度优先搜索
  39. {
  40. MaNode *head = new MaNode;
  41. qmaze.push(head);
  42. while( !qmaze.empty() )
  43. {
  44. MaNode *p= qmaze.front();
  45. //int x= p->x+1;
  46. //int y= p->y+1;
  47. vemaze.push_back(p);
  48. qmaze.pop();
  49. if( p->x ==maxr- && p->y==maxc- )
  50. {
  51. break;
  52. }
  53. if(p->x + <=maxr && maze[p->x+][p->y] == )
  54. {
  55. visit(p->x+,p->y,p);
  56. }
  57. if(p->y+ <=maxc&& maze[p->x][p->y+] == )
  58. {
  59. visit(p->x,p->y+,p);
  60. }
  61. if( p->x- >= && maze[p->x-][p->y] == )
  62. {
  63.  
  64. visit(p->x-,p->y,p);
  65. }
  66. if( p->y- >= && maze[p->x][p->y-] == )
  67. {
  68.  
  69. visit(p->x,p->y-,p);
  70. }
  71.  
  72. }
  73.  
  74. }
  75. void printPath() //打印路径
  76. {
  77. MaNode *p = vemaze[vemaze.size()-];
  78. while( p != NULL )
  79. {
  80. cout<<"("<<p->x<<","<<p->y<<")"<<endl;
  81.  
  82. p=p->pre;
  83. }
  84. //cout<<endl;
  85. }
  86. void destroy() //销毁节点
  87. {
  88. for(size_t i=; i<vemaze.size() ; i++ )
  89. {
  90. delete vemaze[i];
  91. }
  92. }
  93. int main()
  94. {
  95.  
  96. bfs();
  97. printPath();
  98. destroy();
  99. return ;
  100. }

C++解决最基本的迷宫问题的更多相关文章

  1. C++ 栈和典型迷宫问题

    C++ 栈和迷宫问题 1. 前言 栈是一种受限的数据结构,要求在存储数据时遵循先进后出(Last In First Out)的原则.可以把栈看成只有一个口子的桶子,进和出都是走的这个口子(也称为栈顶) ...

  2. Python开发【数据结构】:基础

    数据结构 什么是数据结构? 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中. 比如:列表.集合与字典等都是一种数据结构 N.Wirth: “程序=数据结构+算法” 列表 列表:在其他编程 ...

  3. 6_14 Abbott的复仇(UVa816)<图的最短路BFS>

    1999次世界总决赛的比赛包括一个骰子迷宫问题.在这个问题被写的时候,法官们无法发现骰子迷宫概念的原始来源.不久之后的比赛,但是,罗伯特先生雅培,无数的迷宫和对作者的创造者主题,联系大赛评委,自称是骰 ...

  4. 【LeetCode】505. The Maze II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 日期 题目地址:https://leetcod ...

  5. BFS 、DFS 解决迷宫入门问题

    问题 B: 逃离迷宫二 时间限制: 1 Sec  内存限制: 128 MB提交: 12  解决: 5[提交][状态][讨论版] 题目描述 王子深爱着公主.但是一天,公主被妖怪抓走了,并且被关到了迷宫. ...

  6. 基于visual Studio2013解决C语言竞赛题之1082迷宫

        题目 解决代码及点评 /************************************************************************/ /* ...

  7. golang数据结构之递归解决迷宫问题

    简单来说:递归就是函数/方法自己调用自己,只是每次传入不同的变量. 递归可以解决各种数学问题:n皇后问题.阶乘问题.汉诺塔.迷宫问题.球和篮子问题等等: maze.go package maze im ...

  8. 有关dfs、bfs解决迷宫问题的个人见解

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

  9. 算法基础③--DFS解决迷宫问题入门

    迷宫问题 通过深度优先搜索(DFS)方法实现. 迷宫问题一 一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头 ...

随机推荐

  1. Map集合的遍历.

    package collction.map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; im ...

  2. 《白帽子讲web安全》——吴瀚清 阅读笔记

    浏览器安全 同源策略:浏览器的同源策略限制了不同来源的“document”或脚本,对当前的“document”读取或设置某些属性.是浏览器安全的基础,即限制不同域的网址脚本交互     <scr ...

  3. OpenStack Telemetry系统架构及实践

    1. 概述 早期OpenStack的计量功能由Ceilometer项目负责,后来Ceilometer一分为四,每个项目负责一个方面的工作.不得不说这是OpenStack开发中的一个特色,比如Cinde ...

  4. Cacti 管理员密码忘记找回

    1.登陆数据库: # mysql -uroot -p MariaDB [(none)]> show databases; +--------------------+ | Database | ...

  5. AR+工业,带来哪些革变呢?

            随着技术的普及相信大家对VR和AR也略有所知,尤其是AR增强现实技术,已经成为许多科技巨头企业争相扩疆的热土,目前来说,AR技术最广泛的应用是工业领域,已经显示出巨大的价值.     ...

  6. 牛客网2016.4.11(两个数相加为sum/计数一个int型的二进制有多少个1/二叉树是否左右对称)

    求最小的两个数相加为sum //求最小的两个数相加为sum public ArrayList<Integer> FindNumbersWithSum(int [] array,int su ...

  7. ionic 技术要点

    1.当遇到数据模型改变了,但是页面渲染的数据却没有改变的时候,尝试执行 $scope.$apply(): 2.时间的定义及监听: 定义事件 showNewMsg并从scope往下广播: $scope. ...

  8. unity之初级工程师

    一.值类型与引用类型 值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中.值类型变量声明后,不管是否已经赋值,编译器为其分配内存.值类型的实例通常是在线程栈上分配的(静态 ...

  9. Java之封装,继承,多态

    一,前言 ​ 今天总结一下关于Java的三大特性,封装,继承,多态.其实关于三大特性对于从事编程人员来说都是基本的了,毕竟只要接触Java这些都是先要认识的,接下来就系统总结一下. 二,封装 ​ 先来 ...

  10. 实参&形参

    实参VS形参 1.实参 argument 实际参数,在函数调用的时候,传递给函数的参数.实参-按值调用 实际参数可以是变量.常量.表达式以及函数 实际参数必须得有确定的值(赋值.输入等),在函数调用时 ...