求助#7#9TLE
查看原帖
求助#7#9TLE
118382
torque楼主2021/12/31 03:43
#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了两个点,救救孩子

2021/12/31 03:43
加载中...