简单的题目,只是测试案例的输入后面可能有空格,所以要注意一下输入方式。
#define _CRT_SECURE_NO_WARNINGS //题目的案例输入n,m后面有些貌似有空格。。。 #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; #define MAXN 110 //bool vis[MAXN][MAXN]; char map[MAXN][MAXN]; int n,m,sum; int xx[8]={0,0,1,1,1,-1,-1,-1}; int yy[8]={1,-1,0,1,-1,0,1,-1}; struct tt { int x,y; }; int bfs() { int ans=0; tt front,rear,temp; queue<tt>q; while(!q.empty()) q.pop(); // memset(vis,false,sizeof(vis)); for(int j=0;j<n;j++) { for(int k=0;k<m;k++) { if(map[j][k]=='@') { ans++; sum--; map[j][k]='*'; if(sum==0)return ans; front.x=j,front.y=k; q.push(front); while(!q.empty()) { temp=q.front(); q.pop(); for(int i=0;i<8;i++) { rear.x=temp.x+xx[i]; rear.y=temp.y+yy[i]; if(rear.x>=0&&rear.x<n&&rear.y>=0&&rear.y<m&&map[rear.x][rear.y]=='@') { map[rear.x][rear.y]='*'; q.push(rear); sum--; if(sum==0)return ans; } } } } } } return ans; } int main() { int i,j; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; sum=0; for(i=0;i<n;i++) { scanf("%s",map[i]);//因为输入后貌似有时有空格,所以这么输入好了 for(j=0;j<m;j++) { if(map[i][j]=='@') sum++; } } printf("%d ",bfs()); } return 0; }