[USACO5.1]Starry Night

乍一看,好像很难的样子。

处理联通块+复制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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章