CodeForces 616C The Labyrinth
先预处理出所有连通块,对于每一个*,看他四周的连通块即可
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; const int maxn=1000+10; char s[maxn][maxn]; int Map[maxn][maxn]; int n,m; int dir[4][2]; int Belong[maxn*maxn];//每个点属于哪个联通快 int tot[maxn*maxn];//每个联通快有几个点 int Block; int TT; int tmp[10]; int RT[maxn*maxn]; void DFS(int x,int y) { Map[x][y]=Block; TT++; for(int i=0;i<4;i++) { int NewX=x+dir[i][0]; int NewY=y+dir[i][1]; if(NewX>=0&&NewX<=n-1) if(NewY>=0&&NewY<=m-1) if(Map[NewX][NewY]==0) DFS(NewX,NewY); } } int P(int x,int y) { if(x>=0&&x<=n-1) if(y>=0&&y<=m-1) return 1; return 0; } int main() { dir[0][0]=1;dir[0][1]=0; dir[1][0]=0;dir[1][1]=1; dir[2][0]=-1;dir[2][1]=0; dir[3][0]=0;dir[3][1]=-1; scanf("%d%d",&n,&m); memset(Map,0,sizeof Map); for(int i=0;i<n;i++) scanf("%s",s[i]); Block=1; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(s[i][j]=='*') Map[i][j]=-1; else Map[i][j]=0; } for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(Map[i][j]==0) { TT=0; DFS(i,j); tot[Block]=TT; Block++; } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(s[i][j]=='*') { int ans=0; int tmp[10],xx=0; if(P(i-1,j)) tmp[xx++]=Map[i-1][j]; if(P(i+1,j)) tmp[xx++]=Map[i+1][j]; if(P(i,j-1)) tmp[xx++]=Map[i][j-1]; if(P(i,j+1)) tmp[xx++]=Map[i][j+1]; for(int r=0;r<xx;r++) { int fail=0; for(int d=0;d<r;d++) if(tmp[r]==tmp[d]) fail=1; if(!fail) ans=ans+tot[tmp[r]]; } ans++; ans=ans%10; s[i][j]=ans+'0'; } } } for(int i=0;i<n;i++) printf("%s\n",s[i]); return 0; }