题意:把矩阵n*n中所有的0改成它最接近的正数,若有两个及以上都满足,则不变。
题解:bfs每个0
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int N=50000; 6 int map[300][300],ans[300][300]; 7 int po[N][2]; 8 int stk[N][3]; 9 int dr[][2]={0,1,0,-1,1,0,-1,0}; 10 bool mark[300][300]; 11 int main() 12 { 13 int n; 14 while(scanf("%d",&n)!=EOF) 15 { 16 int x,y,tx,ty,st,ed,num=0,t; 17 for(int i=1;i<=n;i++) 18 for(int j=1;j<=n;j++) 19 { 20 scanf("%d",&map[i][j]); 21 if(!map[i][j]) 22 { 23 po[num][0]=i; 24 po[num][1]=j; 25 num++; 26 } 27 } 28 memcpy(ans,map,sizeof(map)); 29 for(int i=0;i<num;i++) 30 { 31 st=0,ed=1; 32 stk[0][0]=po[i][0]; 33 stk[0][1]=po[i][1]; 34 stk[0][2]=0; 35 int minstep=0,tp=0; 36 memset(mark,false,sizeof(mark)); 37 while(st!=ed) 38 { 39 x=stk[st][0]; 40 y=stk[st][1]; 41 t=stk[st][2]; 42 st++; 43 if(st==N) 44 st=0; 45 if(map[x][y]) 46 { 47 if(minstep==0) 48 minstep=t,tp=map[x][y]; 49 else if(minstep==t) 50 { 51 tp=0; 52 break; 53 } 54 } 55 else if(minstep==0||minstep>t) 56 { 57 for(int j=0;j<4;j++) 58 { 59 tx=x+dr[j][0]; 60 ty=y+dr[j][1]; 61 if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&!mark[tx][ty]) 62 { 63 mark[tx][ty]=true; 64 stk[ed][0]=tx; 65 stk[ed][1]=ty; 66 stk[ed][2]=t+1; 67 ed++; 68 if(ed==N) 69 ed=0; 70 } 71 } 72 } 73 } 74 ans[po[i][0]][po[i][1]]=tp; 75 } 76 for(int i=1;i<=n;i++) 77 { 78 for(int j=1;j<=n;j++) 79 { 80 if(j!=1) 81 printf(" "); 82 printf("%d",ans[i][j]); 83 } 84 printf("\n"); 85 } 86 } 87 return 0; 88 }