广度优先搜索(BFS)
广度优先
Description:
阿狸被困在迷宫,snoopy要去救他,snoopy可以向上、下、左、右四个方向行走,每走一步(格)就要喝掉一瓶益力多。现在给它一个迷宫地图请问:snoopy最少需要多少瓶益力多才能走出迷宫?
Input:
先输入一个数t,表示测试的数据个数, 下面输入的就是t个迷宫, 每个迷宫的输入都应包含以下数据, 输入迷宫的大小 n(n<=15),表示迷宫大小为n*n。 再输入迷宫, 用大写字母“S”表示snoopy的位置, 用小写字母“E”表示阿狸被困的位置, 用“.”表示空白, 用“*”表示障碍, 你知道的阿狸和snoopy都只有一个。
Output:
2
8
S..*....
.*...**.
..*.**..
.*..*..*
*..*E.**
........
.***..*.
....*...
8
S..*....
.*...**.
.**.**..
.*..*..*
*..**.**
........
.***..*.
....*..E
Sample Output:
12
16
题意分析:这题是最简单的求最短距离的题目,也就是典型的BFS问题。
广度优先搜索:http://baike.baidu.com/view/288267.htm 如果不想看这么长的文字解释,可以看一下下面的PPT:http://www.docin.com/p-542536008.html
下面继续分析这道题目,我们挑选第二组数据进行分析。首先,我先把数据从数组下标为[1][1]的地方开始存储。让后在地图的周围“造”一堵墙(如图1)。我们还需要开一个跟地图一样大的数组visit来记录已经走过的点。将所有点初始化为0,走过的点记为1。
图1 图2 图3
然后记录S的坐标。将S入队并标记visit[s.x][s.y]=1,查看S点是否等于E,不等,将队首元素pop出去;否则返回结果。然后查看与S相邻的上下左右4点(上下左右的顺序随便),如果该点不是墙(即'*')并且之前没走过(visit[该点.x][该点.y]等于0),则将该点入队,标记visit[该点.x][该点.y]=1;否则不做处理。相邻的点都查看完后,再取队首元素查看该点是否等于E.......(重复做绿色部分的步骤,直到队列为空)。为了便于理解,上面贴出了图2和图3。图中的数字即为第n步到达的位置。
下面贴出源代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 using namespace std; 5 char map[17][17];//地图 6 bool visit[17][17];//用来记录状态 7 int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}};//方向 8 struct Point 9 { //记录点的坐标和步数 10 int x,y,cnt; 11 }; 12 void BFS(int sx,int sy) 13 { 14 queue<Point> a; 15 Point now,next; 16 now.x = sx; now.y = sy; now.cnt = 0; 17 a.push(now); 18 visit[sx][sy] = 1; 19 while(!a.empty()) 20 { 21 Point temp = a.front(); a.pop(); 22 if(map[temp.x][temp.y] == 'E') 23 { 24 printf("%d\n",temp.cnt); 25 return ; 26 } 27 for(int i = 0; i < 4; i++) 28 { 29 next.x = temp.x+dir[i][0]; 30 next.y = temp.y+dir[i][1]; 31 next.cnt = temp.cnt+1; 32 if((!visit[next.x][next.y]) && (map[next.x][next.y]!='*')) 33 { a.push(next); visit[next.x][next.y] = 1;} 34 } 35 } 36 return ; 37 } 38 int main(void) 39 { 40 int i,j,t,m,n; 41 scanf("%d",&t); 42 while(t--) 43 { 44 int sx,sy; 45 memset(visit,0,sizeof(visit)); 46 scanf("%d",&n); 47 for(i = 1; i <= n; i++) 48 scanf("%s",&map[i][1]); 49 for(i = 0; i <= (n+1); i++) 50 for(j = 0; j <= (n+1); j++) 51 { 52 if(map[i][j] == 'S') 53 sx = i, sy = j; 54 if((i==0) || (j==0) || (i==n+1) || (j==n+1)) 55 map[i][j] = '*'; 56 } 57 BFS(sx,sy); 58 } 59 60 return 0; 61 }
View Code
这是我做的第一道搜索题,做了一下午,才真正搞懂BFS。以前也一直不会BFS,看别人的代码都好长,有的又看不懂。还是上面红色链接里的PPT帮了大忙,不懂的多看几次PPT。下面是我做的PPT也可以看看:http://files.cnblogs.com/files/Muia/%E8%BF%B7%E5%AE%AB.ppt
转载于:https://www.cnblogs.com/Muia/p/5774317.html
广度优先搜索(BFS)相关推荐
- 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
- 广度优先搜索(BFS)——抓住那头牛(POJ 4001)
本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...
- 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++)
[蓝桥杯]历届试题 青蛙跳杯子 问题描述 思路分析 代码实现 问题描述 题目链接:青蛙跳杯子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X星球的流行宠物是青蛙,一般有两种颜色: ...
- 算法简介:层层递进----广度优先搜索(BFS)
算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...
- 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS
一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...
- 算法复习|广度优先搜索BFS
广度优先搜索BFS 文章目录 广度优先搜索BFS HDU-1253 胜利大逃亡 HDU-1241 Oil Deposits 算法思想 从初始状态S开始,利用一定的规则,生成所有下一层的状态,依次入队 ...
- matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
- LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)
1. 题目 这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处. 当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]. 请你判断自己是否能够 ...
最新文章
- CSS之布局(盒子模型--外边距)
- python入门基础代码图-python入门基础知识(代码)
- C五:typedef, define
- python连接plc实例_Python连接数据库MySQL与操作示例
- 加载NMGameX.dll时出错?
- iotop--补齐系统监视工具缺失的一环
- c语言求数列的和_例15:C语言求Fibonacci数列的前30个数
- springMVC操作mongoDB增删改查
- Visual Basic之父回忆往事
- 如何获取具有日期,小时和分钟的ISO 8601格式的当前时刻?
- Hibernate配置文件与关联映射介绍
- 多线程并发编程之构建自定义同步工具
- Composite(组合)
- 使用码云或GitHub搭建简单的个人网站
- hashmap允许null键和值吗_【29期】Java集合框架 10 连问,你有被问过吗?
- 2 线性化 泰勒级数 泰勒公式
- app逆向案例分析-极速抖音
- luogu P3356 火星探险问题(网络流24题 拆点 + 最小费用流 + 路径输出)
- 来啊battle啊,Java和Python你站哪个?
- 给互联网创业公司的8个建议
热门文章
- 热敏电阻温度特性曲线_热敏电阻与体温计的应用关系
- C++11实现自旋锁
- 《MySQL——数据表设计三大范式》
- python 忽略 异常_如何忽略Python中的异常?
- gettype_PHP gettype()函数与示例
- 十、非规则组织分析及其数学模型——锯齿形斜纹组织
- java中Date()类型输入数据的处理
- 劈尖等厚干涉条纹matlab,劈尖等厚干涉实验中,k=0级的干涉条纹是条纹,与k级暗条纹对应的空气薄膜的厚度为...
- HDU ACM Steps攻略 ACM Steps的全部内容
- centos重新安装yum