Date:2019-07-03 14:29:02

  • 走完一层的所有房间,再走下一层,用队列实现

算法实现

  1. /*--------------------------模版----------------------*/
  2. void BFS(int s)
  3. {
  4. queue<int> q;
  5. q.push(s);
  6. while(!q.empty())
  7. {
  8. //取出队首元素top
  9. //访问队首元素top
  10. //将队首元素出列
  11. //将top的下一层结点中未曾入队的结点全部入队,并设置为已入队
  12. }
  13. }
  14.  
  15. /*--------------------------访问-----------------------*/
  16. struct node
  17. {
  18. int data;
  19. }a[];
  20.  
  21. int main()
  22. {
  23. queue<int> q, p;
  24. for(int i=; i<=; i++)
  25. {
  26. a[i].data = i; //a[1]=1,a[2]=2,a[3]=3
  27. q.push(i); //这里将数组的下标入队,而非数组,可以避免传递形参,而无法修改实参的情况
  28. p.push(a[i]);
  29. }
  30. p.front().data = ; //形参无法修改实参
  31. printf("%d\n", a[].data); //output:1
  32. a[] = ; //实参也无法修改形参
  33. printf("%d\n", p.front().data); //output:1
  34.  
  35. a[q.front()].data = ; //通过传递下标,可以修改实参的值
  36. printf("%d\n", a[].data); //output:100
  37. return ;
  38. }
  39. /*-------------------------矩阵问题--------------------*/
  40. /*
  41. Descriptation:
  42. 给出一个m*n的矩阵,矩阵中的元素为0或1。称位置(x,y)与其上下左右四个位置是相邻的。
  43. 如果矩阵中有若干个1是相邻的(不必两两相邻),那么称这些1构成了一个“块”。求给定的矩阵
  44. 中“块”的个数。
  45.  
  46. Sample Input:
  47. 0 1 1 1 0 0 1
  48. 0 0 1 0 0 0 0
  49. 0 0 0 0 1 0 0
  50. 0 0 0 1 1 1 0
  51. 1 1 1 0 1 0 0
  52. 1 1 1 1 0 0 0
  53.  
  54. Sample output:
  55. 4
  56. */
  57.  
  58. #include <cstdio>
  59. #include <queue>
  60. using namespace std;
  61. const int MAX_SIZE = ;
  62. struct node
  63. {
  64. int x, y;
  65. int data;
  66. bool status; //status表示是否入队,而非是否已访问,否则会重复访问
  67. }matrix[MAX_SIZE][MAX_SIZE];
  68.  
  69. //X[],Y[]存放四个操作方向
  70. int n, m, X[]={,,,-}, Y[]={,-,,};
  71. queue<node> q;
  72.  
  73. void Init()
  74. {
  75. for(int i=; i<n; i++)
  76. for(int j=; j<m; j++)
  77. {
  78. scanf("%d", &matrix[i][j].data);
  79. matrix[i][j].status = true;
  80. matrix[i][j].x = i;
  81. matrix[i][j].y = j;
  82. }
  83. }
  84.  
  85. void BFS(node x)
  86. {
  87. q.push(x);
  88. while(!q.empty())
  89. {
  90. node s = q.front();
  91. q.pop();
  92. matrix[s.x][s.y].status = false; //这里不能修改s,需要修改matrix内的元素
  93. if(s.data)
  94. {
  95. for(int i=; i<; i++)
  96. {
  97. int nowX = s.x + X[i];
  98. int nowY = s.y + Y[i];
  99. if(nowX< || nowX>=n || nowY< || nowY>=m)
  100. continue;
  101. if(matrix[nowX][nowY].data && matrix[nowX][nowY].status)
  102. q.push(matrix[nowX][nowY]);
  103. }
  104. }
  105. }
  106. }
  107.  
  108. int main()
  109. {
  110. #ifdef ONLINE_JUDGE
  111. #else
  112. freopen("Test.txt", "r", stdin);
  113. #endif // ONLINE_JUDGE
  114.  
  115. scanf("%d%d", &n, &m);
  116. Init();
  117. int cnt = ;
  118. for(int i=; i<n; i++)
  119. for(int j=; j<m; j++)
  120. {
  121. if(matrix[i][j].data && matrix[i][j].status)
  122. {
  123. BFS(matrix[i][j]);
  124. cnt++;
  125. }
  126. }
  127. printf("%d\n", cnt);
  128.  
  129. return ;
  130. }
  131. /*-------------------------迷宫问题--------------------*/
  132. /*
  133. Description:
  134. 给定一个n*m大小的迷宫,其中*代表不可通过的墙壁,而“.”代表平底,S表示起点,T表示终点。
  135. 移动过程中,如果当前位置是(x,y)(下标从0开始),且每次只能前往上下左右四个位置的平地,
  136. 求从起点到达终点的T的最小步数;
  137.  
  138. Sample Input:
  139. . . . . .
  140. . * . * .
  141. . * S * .
  142. . * * * .
  143. . . . T *
  144. */
  145.  
  146. #include <cstdio>
  147. #include <queue>
  148. using namespace std;
  149. const int MAX_SIZE = ;
  150. struct node
  151. {
  152. char data;
  153. bool status;
  154. int x, y;
  155. int level;
  156. }matrix[MAX_SIZE][MAX_SIZE];
  157.  
  158. int n, m, X[]={,,,-}, Y[]={,-,,};
  159. void Init()
  160. {
  161. scanf("%d%d", &n, &m);
  162. getchar();
  163. for(int i=; i<n; i++)
  164. {
  165. for(int j=; j<m; j++)
  166. {
  167. matrix[i][j].data = getchar();
  168. getchar();
  169. matrix[i][j].status = true;
  170. matrix[i][j].x = i;
  171. matrix[i][j].y = j;
  172. }
  173. }
  174.  
  175. }
  176.  
  177. int BFS(node s)
  178. {
  179. queue<node> q;
  180. q.push(s);
  181. matrix[s.x][s.y].level = ;
  182. while(!q.empty())
  183. {
  184. node v = q.front();
  185. q.pop();
  186. matrix[v.x][v.y].status = false;
  187. for(int i=; i<; i++)
  188. {
  189. int nowX = v.x+X[i];
  190. int nowY = v.y+Y[i];
  191. if(nowX< || nowX>=n || nowY< || nowY>=m)
  192. continue;
  193. if(matrix[nowX][nowY].data=='.' && matrix[nowX][nowY].status)
  194. {
  195. q.push(matrix[nowX][nowY]);
  196. matrix[nowX][nowY].level = matrix[v.x][v.y].level+;
  197. }
  198. else if(matrix[nowX][nowY].data=='T')
  199. return matrix[v.x][v.y].level;
  200. }
  201. }
  202. return -; //无法到达
  203. }
  204.  
  205. int main()
  206. {
  207. #ifdef ONLINE_JUDGE
  208. #else
  209. freopen("Test.txt", "r", stdin);
  210. #endif // ONLINE_JUDGE
  211.  
  212. Init();
  213. for(int i=; i<n; i++)
  214. for(int j=; j<m; j++)
  215. if(matrix[i][j].data=='S')
  216. printf("%d\n", BFS(matrix[i][j]));
  217.  
  218. return ;
  219. }

广度优先搜索(Breadth First Search)的更多相关文章

  1. javascript实现的图数据结构的广度优先 搜索(Breadth-First Search,BFS)和深度优先搜索(Depth-First Search,DFS)

    最后一例,搞得快.三天之内走了一次.. 下一步,面象对像的javascript编程. function Dictionary(){ var items = {}; this.has = functio ...

  2. 算法与数据结构基础 - 广度优先搜索(BFS)

    BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数 ...

  3. (转)广度优先搜索BFS和深度优先搜索DFS

    1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...

  4. 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

  5. [SOJ] 图的广度优先搜索

    Time Limit: 1sec    Memory Limit:256MB Description 读入图的邻接矩阵以及一个顶点的编号(图中顶点的编号为从1开始的连续正整数.顶点在邻接矩阵的行和列上 ...

  6. 广度优先搜索(Breadth First Search, BFS)

    广度优先搜索(Breadth First Search, BFS) BFS算法实现的一般思路为: // BFS void BFS(int s){ queue<int> q; // 定义一个 ...

  7. [MIT6.006] 13. Breadth-First Search (BFS) 广度优先搜索

    一.图 在正式进入广度优先搜索的学习前,先了解下图: 图分为有向图和无向图,由点vertices和边edges构成.图有很多应用,例如:网页爬取,社交网络,网络传播,垃圾回收,模型检查,数学推断检查和 ...

  8. Javascript —— 有向图广度优先搜索

    用Javascript实现有向图的广度优先搜索 刚好遇到一个需求,对于一个有向图,指定一个节点 i 作为起点,输出从 i 出发,可以到达的所有节点,也就是图中以 i 作为起点的子连通片,思考了一下,可 ...

  9. BFS(一):广度优先搜索的基本思想

    广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略. 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的.首先生成第一层 ...

  10. 关于宽搜BFS广度优先搜索的那点事

    以前一直知道深搜是一个递归栈,广搜是队列,FIFO先进先出LILO后进后出啥的.DFS是以深度作为第一关键词,即当碰到岔道口时总是先选择其中的一条岔路前进,而不管其他岔路,直到碰到死胡同时才返回岔道口 ...

随机推荐

  1. Oracle中使用REGEXP_SUBSTR,regexp_replace,wm_concat函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...

  2. java并发编程笔记(三)——线程安全性

    java并发编程笔记(三)--线程安全性 线程安全性: ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...

  3. JS-动态加载

    var s = document.createElement('script'); s.setAttribute('src', ''); s.setAttribute('type', 'text/ja ...

  4. Ubuntu16.04搜狗拼音输入法候选栏无法显示中文(英文乱码)

    输入中文时,若候选栏显示英文乱码.无法显示中文,如下图所示,可按如下方式处理: cd ~/.config rm -rf SogouPY* sogou* 然后注销重新登录即可.

  5. PAT甲级——A1145 HashingAverageSearchTime【25】

    The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...

  6. Loadrunner test web service which need username and password

    Action(){ char  * position; char * str; int  offset; char * search_str = "ERROR"; // web_s ...

  7. spark textFile读取多个文件

    1.spark textFile读取File 1.1 简单读取文件 val spark = SparkSession.builder() .appName("demo") .mas ...

  8. 热修复设计之CLASS_ISPREVERIFIED(二)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从CLASS_ISPREVERIFIED实战来介绍热 ...

  9. Spring Boot实现通用的接口参数校验

    Spring Boot实现通用的接口参数校验 Harries Blog™ 2018-05-10 2418 阅读 http ACE Spring App API https AOP apache IDE ...

  10. Pyhton第八节 字典补充

    Python 字典的基本元素是键值对(key-value), 每个键值对的key和value之间用:分割:每个键值对之间用,分割:整个键值对用花括号{}包围 字典内的键(key)必须唯一,值不需要唯一 ...