【题目链接】

ybt 1335:【例2-4】连通块

【题目考点】

1. 搜索:连通块问题

【解题思路】

设数组vis,vis[i][j]表示(i,j)位置已经访问过。
遍历地图中的每个位置,尝试从每个位置开始进行搜索。
如果该位置不是0且没有访问过,那么访问该位置,并尝试从其上下左右四个位置开始搜索。
在看一个新的位置时,如果该位置在地图内,没有访问过且不是0,那么继续从该位置开始进行搜索。
在遍历网格的过程中,一次成功开始的搜索可以确定一个连通块,统计连通块的个数,即为结果。
搜索方法可以采用深搜或广搜。

【题解代码】

解法1:深搜

#include<bits/stdc++.h>
using namespace std;
#define N 105
int n, m, a[N][N], ans;//ans:连通块个数
bool vis[N][N];//vis[i][j]:(i,j)是否访问过
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void dfs(int sx, int sy)
{for(int i = 0; i < 4; ++i){int x = sx + dir[i][0], y = sy + dir[i][1];if(x >= 1 && x <= n && y >= 1 && y <= m && vis[x][y] == false && a[x][y] == 1){//如果在地图内、没访问过、是黑色的 vis[x][y] = true;dfs(x, y);}}
}
int main()
{cin >> n >> m;for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j)cin >> a[i][j];for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j){if(a[i][j] == 1 && vis[i][j] == false)//如果这里是黑色的且没访问过 {vis[i][j] = true;dfs(i, j);ans++;//每次成功进行深搜可以确定一个连通块 }}cout << ans;return 0;
}

解法2:广搜

#include<bits/stdc++.h>
using namespace std;
#define N 105
struct Node
{int x, y;Node(){}Node(int a, int b):x(a),y(b){}
};
int n, m, a[N][N], ans;//ans:连通块个数
bool vis[N][N];//vis[i][j]:(i,j)是否访问过
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void bfs(int sx, int sy)
{queue<Node> que;vis[sx][sy] = true;que.push(Node(sx,sy));while(que.empty() == false){Node u = que.front();que.pop();for(int i = 0; i < 4; ++i){int x = u.x + dir[i][0], y = u.y + dir[i][1];if(x >= 1 && x <= n && y >= 1 && y <= m && vis[x][y] == false && a[x][y] == 1){vis[x][y] = true;que.push(Node(x,y));}}}
}
int main()
{cin >> n >> m;for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j)cin >> a[i][j];for(int i = 1; i <= n; ++i)for(int j = 1; j <= m; ++j){if(a[i][j] == 1 && vis[i][j] == false)//如果这里是黑色的且没访问过 {bfs(i, j);ans++;//每次成功进行广搜可以确定一个连通块 }}cout << ans;return 0;
}

信息学奥赛一本通 1335:【例2-4】连通块相关推荐

  1. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  2. 【例8】合唱队形(《信息学奥赛一本通第五版》)

    /* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...

  3. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  4. 信息学奥赛一本通(2032:【例4.18】分解质因数)

    2032:[例4.18]分解质因数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 582     通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...

  5. 信息学奥赛一本通——2062:【例1.3】电影票

    2062:[例1.3]电影票 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 57341     通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...

  6. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  7. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  8. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门

    [题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...

  9. 信息学奥赛一本通——2068:【例2.6】鸡兔同笼

    大家好(๑╹◡╹)ノ" 这里是小蒟蒻 一天没更新了呢! 今天给大家带来<信息学奥赛一本通--2068:[例2.6]鸡兔同笼> 题目: 2068:[例2.6]鸡兔同笼 时间限制: ...

最新文章

  1. Python:计算两个蛋白或小分子之间的RMSD
  2. better-scroll刷新后才能滑动的解决方案
  3. Linux对外连接端口数限制
  4. 一名合格的电子工程师,不能逃避的“梗”
  5. codeforces CF986C AND Graph 建圖 dfs
  6. dedecms 系统迁移及问题
  7. C语言基础教程篇之程序结构
  8. Telerik RadColorPicker 漂移问题的解决
  9. 在龙芯平台上编译jogamp(gluegen)
  10. 第二单元 用python学习微积分(十六)定积分
  11. 单三相STS电能表 键盘表 代码表 预付费表 非洲 东南亚 分体式电表方案
  12. 单片机音频信号分析仪
  13. 【龙印】以程序员的角度整定3d打印机的pid实现控温
  14. c#开发环境下用Directx载入3D模型
  15. C语言也能干大事第六节(如鹏基础)
  16. java课题研究方法和技术途径_开题报告中的拟采取的研究方法技术路线和技术关键...
  17. [异能程序员]第六章 遛狗(第二更)
  18. 某科技厅办公工作协同平台
  19. iOS NSUserDefaults删除全部记录或删除指定记录
  20. docker 创建redis容器

热门文章

  1. 使用kso​​ap2的Android SOAP客户端示例
  2. sparklines_Sparklines入门200年来功能强大的数据可视化形式
  3. html自动播放avi视频,使用HTML5 video标签的一系列问题
  4. Codeforces Round #807 (Div. 2)(A-D)
  5. 2021年中国城市财力半年报 Top 30
  6. 【你真的知道?】凤凰、鸳鸯、石狮的雌雄之分
  7. 全球排名前四的眼药水,第一款来自欧洲老牌安瞧AGEPHA Pharma,眼科医生自留!
  8. html格式错误检测,HTML格式错误
  9. FRED应用: LED混合准直透镜模拟
  10. 帮你学会webpack