当前位置:   article > 正文

连通块(信息学奥赛一本通-T1335)_连通块是什么

连通块是什么

【题目描述】

一个n * m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区域,其中的每个黑色格子能通过四连通的走法(上下左右),只走黑色格子,到达该联通块中的其它黑色格子。

【输入】

第一行两个整数n,m(1≤n,m≤100),表示一个n * m的方格图。

接下来n行,每行m个整数,分别为0或1,表示这个格子是黑色还是白色。

【输出】

一行一个整数ans,表示图中有ans个黑色格子连通块。

【输入样例】

3 3
1 1 1
0 1 0
1 0 1

【输出样例】

3

【源程序】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<string>
  7. #include<cstdlib>
  8. #include<queue>
  9. #include<vector>
  10. #define INF 0x3f3f3f3f
  11. #define PI acos(-1.0)
  12. #define N 101
  13. #define MOD 123
  14. #define E 1e-6
  15. using namespace std;
  16. struct node{
  17. int x;
  18. int y;
  19. }q[10100],p;
  20. int a[N][N],vis[N][N];
  21. int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
  22. int main()
  23. {
  24. int n,m;
  25. cin>>n>>m;
  26. for(int i=1;i<=n;i++)
  27. for(int j=1;j<=m;j++)
  28. cin>>a[i][j];
  29. int cnt=0;
  30. for(int i=1;i<=n;i++)
  31. for(int j=1;j<=m;j++)
  32. if(vis[i][j]==0&&a[i][j]==1)
  33. {
  34. cnt++;
  35. vis[i][j]=1;
  36. int head=1,tail=1;
  37. q[tail].x=i;
  38. q[tail].y=j;
  39. tail++;
  40. while(head<tail)
  41. {
  42. p=q[head];
  43. for(int k=0;k<4;k++)
  44. {
  45. int nx=p.x+next[k][0];
  46. int ny=p.y+next[k][1];
  47. if(vis[nx][ny]==0&&a[nx][ny]==1)
  48. {
  49. vis[nx][ny]=1;
  50. q[tail].x=nx;
  51. q[tail].y=ny;
  52. tail++;
  53. }
  54. }
  55. head++;
  56. }
  57. }
  58. cout<<cnt<<endl;
  59. return 0;
  60. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/800429
推荐阅读
相关标签
  

闽ICP备14008679号