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