时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
一个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<stdio.h> 3. #include<cmath> 4. #include<cstring> 5. #include<list> 6. using namespace std; 7. int map[105][105]; 8. int que[15010][2]; 9. int xy_[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; 10. int n,m,tj=0; 11. int main() 12. { 13. scanf("%d %d",&n,&m); 14. for(int i=1;i<=n;i++) 15. for(int j=1;j<=m;j++) 16. scanf("%d",&map[i][j]); 17. for(int i=1;i<=n;i++) 18. for(int j=1;j<=m;j++){ 19. if(map[i][j]){ 20. tj++; 21. int top=0; 22. int tail=0; 23. memset(que,0,sizeof(que)); 24. que[tail][0]=i;que[tail][1]=j;tail++; 25. while(tail>top){ 26. int x=que[top][0],y=que[top][1];top++; 27. for(int k=0;k<4;k++){ 28. if(map[x+xy_[k][0]][y+xy_[k][1]]){ 29. que[tail][0]=x+xy_[k][0]; 30. que[tail][1]=y+xy_[k][1]; 31. tail++; 32. } 33. } 34. map[x][y]=0; 35. } 36. } 37. } 38. cout<<tj<<endl; 39. return 0; 40. }