您的位置:首页 > 其它

[USACO5.1]Starry Night

2017-08-30 15:01 429 查看
乍一看,好像很难的样子。

处理联通块+复制8份+判重

感觉随随便便就是
Lines:100+100+100


可以通过优化后两步来优化代码复杂度。

当然要用到一个神奇的思想
hash


我们可以将一个点对一个星系的贡献为:它上下左右星星的个数+1与其它四个方向星星的个数+5的积

正确率比较高,不过还是A了

#define N 510
map<int,int>t;
int n,m,ap

,h

,pr

,p

,ax,_

;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: