#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 5000
int n,m,L[N],R[N],U[N],D[N],H[N],S[N],COL[N],ROW[N],ANS[N],cnt,cntLine;
void Insert_DLX(int r,int c){
cnt++;
S[c]++;ROW[cnt]=r,COL[cnt]=c;
U[cnt]=c,D[cnt]=D[c],U[D[c]]=cnt,D[c]=cnt;
if(H[r]==-1) H[r]=L[cnt]=R[cnt]=cnt;
else{
R[cnt]=H[r],L[cnt]=L[H[r]];
R[L[H[r]]]=cnt,L[H[r]]=cnt;
}
}
void Remove_DLX(int c){
int i,j;
R[L[c]]=R[c],L[R[c]]=L[c];
for(i=D[c];i!=c;i=D[i]) for(j=R[i];j!=i;j=R[j]){
U[D[j]]=U[j],D[U[j]]=D[j];
S[COL[j]]--;
}
}
void Resume_DLX(int c){
int i,j;
for(i=U[c];i!=c;i=U[i]) for(j=L[i];j!=i;j=L[j]){
U[D[j]]=j,D[U[j]]=j;
S[COL[j]]++;
}
R[L[c]]=c,L[R[c]]=c;
}
int Dance_DLX(int depth){
if(R[0]==0){
int i;
for(i=0;i<depth;i++) printf("%d ",ANS[i]);
return 1;
}
int i,j,min_loc=R[0];
for(i=R[0];i;i=R[i]) if(S[i]<S[min_loc]) min_loc=i;
Remove_DLX(min_loc);
for(i=D[min_loc];i!=min_loc;i=D[i]){
ANS[depth]=ROW[i];
for(j=R[i];j!=i;j=R[j]) Remove_DLX(COL[j]);
if(Dance_DLX(depth+1)) return 1;
for(j=L[i];j!=i;j=L[j]) Resume_DLX(COL[j]);
}
Resume_DLX(min_loc);
return 0;
}
int main(){
scanf("%d %d",&n,&m);cnt=m;int i,j;
for(i=0;i<=m;i++){
L[i]=i-1,R[i]=i+1;
U[i]=D[i]=i;
}
L[0]=m,R[m]=0;
memset(H,-1,sizeof(H));
memset(S,0,sizeof(S));
for(i=1;i<=n;i++) for(j=1;j<=m;j++){
int t;scanf("%d",&t);
if(t) Insert_DLX(i,j);
}
if(Dance_DLX(0)==0) printf("No solution!");
return 0;
}
这段代码为什么只有80分啊,T了两个点,救救孩子