这个题我是看着解题报告做的。
首先可以根据最后一列推出第一列。然后依次寻找每一行自己左移得到的下一行记录到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");
}