Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16655 | Accepted: 8917 |
Description
Input
Output
Sample Input
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
Sample Output
0 1 2 2
本题是经典的DFS题,利用DFS求连通块的数量,DFS利用的是递归实现
#include<iostream> using namespace std; const int maxn = 100+5; char pic[maxn][maxn]; //图表 int m, n, idx[maxn][maxn]; //连通分量编号矩阵 //用DFS的方法为连通分量矩阵编号 void DFS(int r, int c, int id) { if(r<0||r>m||c<0||c>=n)return; //overload if(idx[r][c]>0||pic[r][c]!=‘@‘)return; //no ‘@‘ or 已经访问 idx[r][c]=id; //连通分量编号 for(int dr=-1; dr<=1;dr++) for(int dc=-1;dc<=1;dc++) if(dr!=0||dc!=0)DFS(r+dr, c+dc, id); } int main() { while(cin>>m>>n&&m!=0) { for(int i=0;i<m;i++) for(int j=0;j<n;j++) cin>>pic[i][j]; for(int i=0;i<m;i++) for(int j=0;j<n;j++) idx[i][j]=0; int cnt=0; for(int i=0;i<m;i++) for(int j=0;j<n;j++) if(idx[i][j]==0&&pic[i][j]==‘@‘)DFS(i,j,++cnt); cout<<cnt<<endl; } return 0; }
可以参考floodfill算法
https://en.wikipedia.org/wiki/Flood_fill
原文:http://www.cnblogs.com/KennyRom/p/6111869.html