POJ 1147 Binary Codes 杂题
这个题我是看着解题报告做的。
首先可以根据最后一列推出第一列。然后依次寻找每一行自己左移得到的下一行记录到next数组中
#include<stdio.h> #include<stdlib.h> int main(){ int n; int lastcol[3005]; int firstcol[3005]; int firstrow[3005]; int visit[3005]={0}; int next[3005]; int i,sum=0,j; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&lastcol[i]); if(lastcol[i]==0) sum++; } for(i=1;i<=sum;i++){ firstcol[i]=0; } for(;i<=n;i++){ firstcol[i]=1; } for(i=1;i<=sum;i++){ for(j=1;j<=n;j++) if(lastcol[j]==0 && !visit[j]){ visit[j]=1; next[i]=j; break; } } for(;i<=n;i++){ for(j=1;j<=n;j++) if(lastcol[j]==1 && !visit[j]){ visit[j]=1; next[i]=j; break; } } j=1; firstrow[1]=firstcol[1]; for(i=2;i<=n;i++){ firstrow[i]=firstcol[next[j]]; j=next[j]; } for(i=1;i<=n;i++) printf("%d ",firstrow[i]); printf("\n"); }