分析:每输入一个x,y就dfs搜索一遍的话会TLE的,这题的正解是输入字符数组之后就dfs分块,然后每输入一个坐标就直接输出它对应块中的C的个数。
代码:
#include<iostream> #include<cstring> using namespace std; int t,m,n,q; int color[600][600]; char a[600][600]; int C[360000]; int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int col; int x,y; void dfs(int x,int y,int col) { if(a[x][y]=='#') return; color[x][y]=col; if(a[x][y]=='C') C[col]++; a[x][y]='#'; for(int i=0;i<4;i++){ int dx=x+d[i][0]; int dy=y+d[i][1]; if(dx>0&&dx<=m&&dy>0&&dy<=n){ dfs(dx,dy,col); } } return; } int main() { cin>>t; for(int i=1;i<=t;i++){ cin>>m>>n>>q; memset(a,'#',sizeof(a)); memset(color,0,sizeof(color)); memset(C,0,sizeof(C)); for(int j=1;j<=m;j++) for(int k=1;k<=n;k++){ cin>>a[j][k]; } col=0; for(int k=1;k<=m;k++) for(int j=1;j<=n;j++){ if(color[k][j]==0&&a[k][j]!='#') dfs(k,j,++col); } cout<<"Case "<<i<<":"<<endl; for(int j=1;j<=q;j++){ cin>>x>>y;cout<<C[color[x][y]]<<endl; } } return 0; }