以防万一有人想不开要做染色的题呢?比如我。

广度优先搜索

如何实现一个广度优先搜索

  • 广搜(bfs)是一个层层递进的概念,与深搜的不撞南墙不回头不同,广搜更像一个感染的过程,一个点只能感染到它周边的点。
  • 首先,我们要定义一个队列que,这里的que每一项是个结构体,包含xy两个值。
  • que队列装着访问过的点,与它有关的有两个变量(当做指针使用,但不是那个带*的指针)分别为headtail,指向队头和队尾。
  • 对于每个入队的点,向四个方向拓展。这里我用一个next数组表示方向。(可以让代码看起来清新一点)
  • 广搜什么时候结束?对于每个点都拓展完,此时是head=tail
  • 广搜是没有递归的。

例题

宝岛探险

题目描述

一个小岛由一个主岛和一些复附属岛屿组成,该岛使用一个二维矩阵表示,其中数字表示海拔,0表示海洋,1~9表示陆地。探险家乘坐飞机降落在(6,8)处,现在需要统计探险家降落的小岛的面积大小,我们将探险家降落点上下左右相连接的陆地视作同一个岛屿。

这题用深搜做也是可以的,但是本文介绍的是广搜的方法。


测试样例:

10 10 6 8
1 2 1 0 0 0 0 0 2 3
3 0 2 0 1 2 1 0 1 2
4 0 1 0 1 2 3 2 0 1
3 2 0 0 0 1 2 4 0 0
0 0 0 0 0 0 1 5 3 0
0 1 2 1 0 1 5 4 3 0
0 1 2 3 1 3 6 2 1 0
0 0 3 4 8 9 7 5 0 0
0 0 0 3 7 8 6 0 1 2
0 0 0 0 0 0 0 0 1 0

样例输出

38

题解

#include<stdio.h>
struct note
{int x;int y;
};
struct note que[400];
int head, tail;
int a[200][200];//地图
int book[200][200];
int next[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};int main()
{int n, m, startx, starty;int sum;int tx, ty;int i, j, k;scanf("%d %d %d %d", &n, &m, &startx, &starty);for (i = 1; i <= n; i++)for (j = 1; j <= m; j++)scanf("%d", &a[i][j]);head = 1;tail = 1;book[startx][starty] = 1;//往记录队列里插入起点坐标que[head].x = startx;que[head].y = starty;tail++;sum = 1;while (head < tail){for (k = 0; k < 4; k++){tx = que[head].x + next[k][0];ty = que[head].y + next[k][1];if (tx < 1 || tx > n || ty < 1 || ty > m)continue;if (a[tx][ty] > 0 && book[tx][ty] == 0){sum++;book[tx][ty] = 1;que[tail].x = tx;que[tail].y = ty;tail++;}}head++;}printf("%d", sum);return 0;
}

至此你已经看完了全部内容,如果想要求得岛屿的个数,请看另一篇文章(算法是DFS不是BFS哦!)
深度优先搜索解决连通块/染色问题——求岛的个数

[C] 层层递进——C语言实现广度优先搜索相关推荐

  1. 第4章第3节-层层递进-广度优先搜索

    /*层层递进-广度优先搜索*/ #include "stdio.h" struct note {     int x;//横坐标     int y;//纵坐标     int f ...

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

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

  3. 层层递进-广度优先搜索

    从题目可以看出,广度优先搜索是一层一层的搜索,而深搜是一根筋,一直搜到底O(∩_∩)O哈哈~. 到底怎么实现广搜呢?深搜是递归,想必大家可能恨死递归了.广搜不用递归,就用循环和队列就够! 这个题目,从 ...

  4. 数据结构深度优先搜索c语言,C语言数据结构与算法之深度、广度优先搜索

    一.深度优先搜索(Depth-First-Search 简称:DFS) 1.1 遍历过程: (1)从图中某个顶点v出发,访问v. (2)找出刚才第一个被顶点访问的邻接点.访问该顶点.以这个顶点为新的顶 ...

  5. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  6. 八数码c语言编程深度搜索,广度优先搜索解 八数码, 求意见, 求bug/

    已结贴√ 问题点数:100 回复次数:31 广度优先搜索解 , 求意见, 求bug/ 我得去买票了,.... #include #include #include #define NUM 5 type ...

  7. 连通图遍历策略之广度优先搜索(C语言)

    广度优先搜素(BFS) 广度优先搜索(又称宽度优先搜索)算法是最简便的图的搜索算法之一,该算法属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果.换句话说,它并不考虑结果的可能位置, ...

  8. 广度优先搜索c语言矩阵,算法7-6:图的遍历——广度优先搜索 (C++代码)

    解题思路: 首先要开一个二维数组储存邻接矩阵,一般的方法是开一个足够大的数组,例如这道题是n不大于50,不过这样做会造成空间不必要的浪费.因此手动分配空间会更为合理.一种方法是用malloc,对应销毁 ...

  9. 邻接表形式存储图并且按广度优先搜索遍历的C语言实现

    用邻接表形式存储图并且按广度优先搜索打印遍历结果 #include<stdio.h> #define MAX_VERTEX_NUM 20//最多顶点个数 #define ERROR -1t ...

最新文章

  1. php循环遍历数组保存数据库,php数组循环遍历 - 与狼共舞红队的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. [转载]httpClient.execute抛Connection to refused异常问题
  3. CSS HACK 区别 IE6、IE7、IE8、Firefox兼容性
  4. 两列自适应布局的4种思路
  5. mmap、munmap函数
  6. 森源电气持续押注光伏 加强市场竞争力
  7. 主动模式下FTP的详细工作过程
  8. MYSQL基础八--子查询和连接
  9. 转载【C++】int转换为string的两种方法(to_string、字符串流)
  10. 必须掌握的30种SQL语句优化
  11. 软件设计原则(四) 里氏替换原则
  12. 在线教育公司的硬件雄心:1秒查词,网易有道发布词典笔二代
  13. JavaEE简易聊天室(Netbeans:Servlet+Cookie+Session)
  14. 什么是光电耦合器?光耦有哪些类型
  15. 【报告分享】代餐行业营销洞察报告-丁香医生(附下载)
  16. OPenCV4-颜色识别(一)调色板和简单的颜色识别
  17. python tell方法_Python File tell() 方法
  18. 独家丨拼流量、拼资源、拼技术—— BaaS已沦为巨头的游戏?
  19. matlab histogram绘制直方图并标注对应数值
  20. pcm转mp3_前端音频可视化——PCM数据解决方案

热门文章

  1. 2022-2028年中国廉价航空行业深度调研及投资前景预测报告
  2. etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程
  3. Go 知识点(14) — Go 多协程(单个协程触发panic会导致其它所有协程挂掉,每个协程只能捕获到自己的 panic 不能捕获其它协程)
  4. TFRecord tf.train.Feature
  5. Google Colab——用谷歌免费GPU跑你的深度学习代码
  6. MyBatis常规CURD详解及拓展~
  7. PHP算法题:如何实现冒泡排序
  8. Ubuntu系统创建AndroidStudio启动图标(快捷方式)
  9. You must reset your password using ALTER USER statement before executing thi
  10. P2245 星际导航