PKU 2329

牛人估计都是DP过去的,我DP不会,爆搜过去的,只能怪这题的时间限制太不科学了。。。3032MS 才AC。。。

广搜。。。以(i,j)为原点向四周搜在同样的步数内能同时到达的点,第一次找到后就直接跳出出来。。。

代码:

 

 #include<iostream> using namespace std; const int N = 205 ; int map[N][N],sign[N][N],q[N*N],flag[N][N]; int n; int dirx[]={0,-1,0,1}; int diry[]={-1,0,1,0}; void BFS(int x,int y) { memset(flag,0,sizeof(flag)); int head=0,tail=1; q[0]=x*n+y; flag[x][y]=1; while(head<tail) { int k,Near=-1,Num=0,tmp=tail; for(k=head;k<tmp;k++) { int tx=q[k]/n,ty=q[k]%n; if(map[tx][ty]) { Num++; Near=map[tx][ty]; } for(int i=0;i<4;i++) { int next_x = tx + dirx[i]; int next_y = ty + diry[i]; if(next_x>=0&&next_x<n&&next_y>=0&&next_y<n&&flag[next_x][next_y]==0) { flag[next_x][next_y]=1; q[tail++]= next_x*n+next_y; } } } if(Num>0) { if(Num==1) sign[x][y]=Near; break; } head=k; } } int main() { while(EOF!=scanf("%d",&n)) { memset(sign,0,sizeof(sign)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]); for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(!map[i][j]) BFS(i,j); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) if(map[i][j])printf("%d ",map[i][j]); else if(sign[i][j])printf("%d ",sign[i][j]); else printf("%d ",map[i][j]); printf("/n"); } } return 0; }

你可能感兴趣的:(PKU 2329)