题目:
Description
地质探测公司负责探测地下石油资源,每次在一块矩形的区域上查找。探测人员用把这块矩形区域分成 了N X M个正方形小块,然后对每个正方形小块分别进行分析,经过分析之后,为每个小块都做了一个标记,如果一个小块地下发现有石油,则用“@”标记,否则用”.标记”。如果两个含有石油的小块是相邻的,那么它们属于同一块石油地,这里的相邻包括水平,垂直,或者对角相邻。给定一块已经标记过的矩形区域,你的任务是找出这块区域上的石油地的个数
Input
本题有多组输入数据。对于每一组输入数据,第一行输入两个数M,N,(1<=M,N<=100),接下来是M行,每行含有N个字符,每个字符要么是“@”,要么是”*”。
Output
对于每组数据,输出一行,包含一个整数,它表示石油的地块数
Sample Input
Original | Transformed |
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
Sample Output
Original | Transformed |
0 1 2 2
分析:直接dfs把相连的@全部变成*。
代码:
#include<iostream> #include<cstdio> #include<queue> #include<string> #include<cstring> using namespace std; int book[120][120],sum int next1[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}}; char num[120][120]; int n,m; void dfs(int x,int y) { int tx,ty; num[x][y]='*'; for(int k=0;k<8;k++) { tx=x+next1[k][0]; ty=y+next1[k][1]; if(tx<0||tx>=n||ty<0||ty>=m) continue; if(num[tx][ty]=='@'&&book[tx][ty]==0) { book[tx][ty]=1; dfs(tx,ty); } } return ; } int main() { while(~scanf("%d%d",&n,&m)) { sum=0; memset(book,0,sizeof(book)); for(int i=0;i<n;i++) scanf("%s",num[i]); for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(num[i][j]=='@') { sum++; book[i][j]=1; dfs(i,j); } printf("%d ",sum); } return 0; }