CodeForces 616C The Labyrinth

时间:2023-03-09 05:54:43
CodeForces 616C The Labyrinth

先预处理出所有连通块,对于每一个*,看他四周的连通块即可

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std; const int maxn=+;
char s[maxn][maxn];
int Map[maxn][maxn];
int n,m;
int dir[][];
int Belong[maxn*maxn];//每个点属于哪个联通快
int tot[maxn*maxn];//每个联通快有几个点
int Block;
int TT;
int tmp[];
int RT[maxn*maxn]; void DFS(int x,int y)
{
Map[x][y]=Block; TT++;
for(int i=;i<;i++)
{
int NewX=x+dir[i][];
int NewY=y+dir[i][];
if(NewX>=&&NewX<=n-)
if(NewY>=&&NewY<=m-)
if(Map[NewX][NewY]==)
DFS(NewX,NewY);
}
} int P(int x,int y)
{
if(x>=&&x<=n-)
if(y>=&&y<=m-)
return ;
return ;
} int main()
{
dir[][]=;dir[][]=;
dir[][]=;dir[][]=;
dir[][]=-;dir[][]=;
dir[][]=;dir[][]=-; scanf("%d%d",&n,&m);
memset(Map,,sizeof Map);
for(int i=;i<n;i++) scanf("%s",s[i]);
Block=;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(s[i][j]=='*') Map[i][j]=-;
else Map[i][j]=;
} for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(Map[i][j]==)
{
TT=;
DFS(i,j);
tot[Block]=TT;
Block++;
}
} for(int i=;i<n;i++)
{
for(int j=;j<m;j++)
{
if(s[i][j]=='*')
{
int ans=;
int tmp[],xx=;
if(P(i-,j)) tmp[xx++]=Map[i-][j];
if(P(i+,j)) tmp[xx++]=Map[i+][j];
if(P(i,j-)) tmp[xx++]=Map[i][j-];
if(P(i,j+)) tmp[xx++]=Map[i][j+];
for(int r=;r<xx;r++)
{
int fail=;
for(int d=;d<r;d++) if(tmp[r]==tmp[d]) fail=;
if(!fail) ans=ans+tot[tmp[r]];
}
ans++;
ans=ans%;
s[i][j]=ans+'';
}
}
} for(int i=;i<n;i++) printf("%s\n",s[i]);
return ;
}