题干略。
注意八连块的遍历方式,秒得很:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 100+10 #define inf 100000000 char pic[maxn][maxn]; int ltf[maxn][maxn],m,n; void dfs(int h,int l,int lt){ if(h<0 || h>=m || l< 0 || l>=n) return; if(ltf[h][l]==0 && pic[h][l]==‘@‘){ ltf[h][l]=lt; for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) if(i!=0 || j!=0 ) dfs(h+i,l+j,lt); } else return; } int main(){ while(scanf("%d%d",&m,&n)==2 && m && n){ int cnt=0; for(int i=0;i<m;i++) scanf("%s",pic[i]); memset(ltf,0,sizeof(ltf)); for(int i=0;i<m;i++) for(int j=0;j<n;j++) if(ltf[i][j]==0 && pic[i][j]==‘@‘) dfs(i,j,++cnt); cout<<cnt<<endl; } return 0; }