广度优先

Description:

阿狸被困在迷宫,snoopy要去救他,snoopy可以向上、下、左、右四个方向行走,每走一步(格)就要喝掉一瓶益力多。现在给它一个迷宫地图请问:snoopy最少需要多少瓶益力多才能走出迷宫?

Input:

先输入一个数t,表示测试的数据个数, 下面输入的就是t个迷宫, 每个迷宫的输入都应包含以下数据, 输入迷宫的大小 n(n<=15),表示迷宫大小为n*n。 再输入迷宫, 用大写字母“S”表示snoopy的位置, 用小写字母“E”表示阿狸被困的位置, 用“.”表示空白, 用“*”表示障碍, 你知道的阿狸和snoopy都只有一个。

Output:

输出需要的最少的益力多的瓶数m(数据保证一定有最少需要的利益多的瓶数)
Sample Input:

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)相关推荐

  1. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  2. 广度优先搜索(BFS)——抓住那头牛(POJ 4001)

    本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...

  3. 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++)

    [蓝桥杯]历届试题 青蛙跳杯子 问题描述 思路分析 代码实现 问题描述 题目链接:青蛙跳杯子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X星球的流行宠物是青蛙,一般有两种颜色: ...

  4. 算法简介:层层递进----广度优先搜索(BFS)

    算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...

  5. 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS

    一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...

  6. 算法复习|广度优先搜索BFS

    广度优先搜索BFS 文章目录 广度优先搜索BFS HDU-1253 胜利大逃亡 HDU-1241 Oil Deposits 算法思想 从初始状态S开始,利用一定的规则,生成所有下一层的状态,依次入队 ...

  7. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  8. 广度优先搜索 BFS算法

    广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...

  9. LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)

    1. 题目 这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处. 当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]. 请你判断自己是否能够 ...

最新文章

  1. CSS之布局(盒子模型--外边距)
  2. python入门基础代码图-python入门基础知识(代码)
  3. C五:typedef, define
  4. python连接plc实例_Python连接数据库MySQL与操作示例
  5. 加载NMGameX.dll时出错?
  6. iotop--补齐系统监视工具缺失的一环
  7. c语言求数列的和_例15:C语言求Fibonacci数列的前30个数
  8. springMVC操作mongoDB增删改查
  9. Visual Basic之父回忆往事
  10. 如何获取具有日期,小时和分钟的ISO 8601格式的当前时刻?
  11. Hibernate配置文件与关联映射介绍
  12. 多线程并发编程之构建自定义同步工具
  13. Composite(组合)
  14. 使用码云或GitHub搭建简单的个人网站
  15. hashmap允许null键和值吗_【29期】Java集合框架 10 连问,你有被问过吗?
  16. 2 线性化 泰勒级数 泰勒公式
  17. app逆向案例分析-极速抖音
  18. luogu P3356 火星探险问题(网络流24题 拆点 + 最小费用流 + 路径输出)
  19. 来啊battle啊,Java和Python你站哪个?
  20. 给互联网创业公司的8个建议

热门文章

  1. 热敏电阻温度特性曲线_热敏电阻与体温计的应用关系
  2. C++11实现自旋锁
  3. 《MySQL——数据表设计三大范式》
  4. python 忽略 异常_如何忽略Python中的异常?
  5. gettype_PHP gettype()函数与示例
  6. 十、非规则组织分析及其数学模型——锯齿形斜纹组织
  7. java中Date()类型输入数据的处理
  8. 劈尖等厚干涉条纹matlab,劈尖等厚干涉实验中,k=0级的干涉条纹是条纹,与k级暗条纹对应的空气薄膜的厚度为...
  9. HDU ACM Steps攻略 ACM Steps的全部内容
  10. centos重新安装yum