题目大意:给你一个m*n的矩阵,里面有两种符号,一种是 @ 表示这个位置有油田,另一种是 * 表示这个位置没有油田,现在规定相邻的任意块油田只算一块油田,这里的相邻包括上下左右以及斜的的四个方向相邻的位置。要你求出一共有多少块油田。
解题报告:用dfs,我的做法是首先在输入的时候将每个有油田的位置标记为1,否则标记为0,然后枚举每一个点,如果这个点有油田,则以这个点为起点,像周围的八个方向搜索,搜到了相邻的点就标记为2,当然这里也可以标记为0,只要是将已经搜过的点标记掉就是了,当dfs退出到main函数的时候,油田数量加一。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<cstdlib> 7 const int MAX = 100+5; 8 int m,n,map[MAX][MAX],num; 9 int dire[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}}; 10 void dfs(int x,int y) { 11 if(map[x][y] == 1) { 12 map[x][y] = 2; 13 for(int i = 0;i<8;++i) { 14 int xx = x + dire[i][0]; 15 int yy = y + dire[i][1]; 16 if(xx<1||xx>m||yy<1||yy>n) 17 continue; 18 dfs(xx,yy); 19 } 20 } 21 } 22 23 24 int main() { 25 char c,shu[MAX][MAX]; 26 while(scanf("%d%d",&m,&n),m+n) { 27 memset(map,0,sizeof(map)); 28 for(int i = 1;i<=m;++i) { 29 getchar(); 30 for(int j = 1;j<=n;++j) { 31 scanf("%c",&c); 32 if(c == '@') 33 map[i][j] = 1; 34 } 35 } 36 int ans = 0; 37 for(int i = 1;i<=m;++i) 38 for(int j = 1;j<=n;++j) 39 if(map[i][j] == 1) { 40 dfs(i,j); 41 ans++; 42 } 43 printf("%d ",ans); 44 } 45 return 0; 46 } 47 48