乍一看,好像很難的樣子。
處理聯通塊+複製8份+判重
感覺隨隨便便就是Lines:100+100+100
可以通過優化後兩步來優化代碼複雜度。
當然要用到一個神奇的思想hash
我們可以將一個點對一個星系的貢獻爲:它上下左右星星的個數+1與其它四個方向星星的個數+5的積
正確率比較高,不過還是A了
#define N 510
map<int,int>t;
int n,m,ap[N][N],h[N][N],pr[N][N],p[N][N],ax,_[N][N];
int get(int x,int y)
{
if(!ap[x][y]||p[x][y])
return 0;
p[x][y]=1;
return get(x+1,y-1)+get(x+1,y)+get(x+1,y+1)+get(x,y-1)+get(x,y+1)+get(x-1,y-1)+get(x-1,y)+get(x-1,y+1)+h[x][y];
}
void print(int x,int y,int k)
{
if(!ap[x][y]||pr[x][y])
return;
pr[x][y]=k;
print(x+1,y+1,k);
print(x+1,y,k);
print(x+1,y-1,k);
print(x,y+1,k);
print(x,y-1,k);
print(x-1,y+1,k);
print(x-1,y,k);
print(x-1,y-1,k);
}
int main()
{
m=read();
n=read();
fr(i,1,n)
{
char c=getchar();
while(c<'0'||c>'1')
c=getchar();
fr(j,1,m)
{
ap[i][j]=c-48;
c=getchar();
}
}
fr(i,1,n)
fr(j,1,m)
h[i][j]=(ap[i-1][j]+ap[i+1][j]+ap[i][j-1]+ap[i][j+1]+1)*(ap[i-1][j-1]+ap[i-1][j+1]+ap[i+1][j-1]+ap[i+1][j+1]+5);
fr(i,1,n)
fr(j,1,m)
if(ap[i][j]&&(!pr[i][j])&&(!p[i][j]))
{
int k=get(i,j);
if(t[k])
k=t[k];
else
{
t[k]=++ax;
k=t[k];
}
print(i,j,k+'a'-49);
}
fr(i,1,n)
{
fr(j,1,m)
putchar(pr[i][j]+48);
putchar('\n');
}
return 0;
}