这题意也是醉.
简单dfs;对于一个油田"@"来说,上下左右斜上斜下八个方向如果也是"@"的话,就算同一个;那么,就用深搜搜呗..
每次找到一个"@",就把所有的跟他相关联的全部标记上,然后继续找下一个;
AC代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include <iostream> 5 #include <queue> 6 #include <math.h> 7 const int dx[8]= {0,0,-1,1,-1,-1,1,1}; 8 const int dy[8]= {1,-1,0,0,-1,1,-1,1}; 9 using namespace std; 10 int vis[200][200],n,m,sum; 11 char s[205][205]; 12 void dfs(int x,int y) 13 { 14 for(int i=0;i<8;i++) 15 { 16 int kx=x+dx[i]; 17 int ky=y+dy[i]; 18 if(kx>=0&&kx<n&&ky>=0&&ky<m&&vis[kx][ky]==0&&s[kx][ky]=='@') 19 { 20 // sum++; 英语太渣,,不过题意不是说An oil deposit will not contain more than 100 pockets. 妈哒还是英语太渣. 21 // if(sum>100) 22 // { 23 // return ; 24 // } 25 vis[kx][ky]=1; 26 dfs(kx,ky); 27 } 28 } 29 return ; 30 } 31 int main() 32 { 33 while(~scanf("%d%d",&n,&m)) 34 { 35 if(n==0&&m==0) 36 { 37 break; 38 } 39 memset(vis,0,sizeof(vis)); 40 for(int i=0;i<n;i++) 41 { 42 scanf("%s",s[i]); 43 } 44 int cnt=0; 45 for(int i=0;i<n;i++) 46 { 47 for(int j=0;j<m;j++) 48 { 49 if(s[i][j]=='@'&&vis[i][j]==0)//每次都找一个没被搜过的点,这个点一定和他关联的点一定算一个新的点. 50 { 51 // sum=1; 52 dfs(i,j); 53 cnt++; 54 } 55 } 56 } 57 printf("%d ",cnt); 58 } 59 return 0; 60 }