标签:
Description
Input
Output
Sample Input
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
Sample Output
0 1 2 2
题目大意:给你个M*N的矩阵,每个单位要么是‘*’(无石油)要么是‘@’(有石油),
要你找有多少个不相连的石油。
题目思路:这个相当于是找连通块问题,用循环找到的第一个@,然后再向它的八方查找,再找到一个@,
又向它的八方遍历,直到八方都找不到@,那么这就是第一个连通块,(用数组把他们都标记为1),
其他的也是这样找直到把这个矩阵遍历完。(这也就是种子填补法)
代码:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 const int maxn=100+5; 6 char a[maxn][maxn]; 7 int m,n,b[maxn][maxn]; 8 void dfs(int r,int c,int id) 9 { 10 if(r<0||r>=m||c<0||c>=n) 11 return; 12 if(b[r][c]>0||a[r][c]!=‘@‘) 13 return; 14 b[r][c]=id; 15 for(int dr=-1;dr<=1;dr++) 16 for(int dc=-1;dc<=1;dc++) 17 if(dr!=0||dc!=0) 18 dfs(r+dr,c+dc,id); 19 } 20 int main() 21 { 22 int i,j; 23 while(cin>>m>>n&&m&&n) 24 { 25 for(i=0;i<m;i++) 26 cin>>a[i]; 27 memset(b,0,sizeof(b)); 28 int cnt=0; 29 for(i=0;i<m;i++) 30 { 31 for(j=0;j<n;j++) 32 if(b[i][j]==0&&a[i][j]==‘@‘) 33 dfs(i,j,++cnt); 34 } 35 36 cout<<cnt<<endl; 37 } 38 return 0; 39 }
标签:
原文地址:http://www.cnblogs.com/huaxiangdehenji/p/4696513.html