Code
structdlx{intN,id; intL[MAXN],R[MAXN],U[MAXN],D[MAXN]; intc[maxn],s[maxn],loc[maxn][2]; voidInitintnn=0)//Long Pass{n=nn; for(intI=0; i<=n;i++) u[i]=d[i]=i,l[i]=i-1, r[i]=i+1; l[0]=n; r[n]=0; ID=N; memset (S),0,sizeof(S)); } voidAddRow (intXintColintA[])//incoming parameters are row labels, column lengths, column arrays { BOOLhas=false; intFirst=id+1; for(inty=1; y<=col;y++) { if(a[y]==0)Continue; has=true; ++ID; L[id]=id-1; R[id]=id+1; D[id]=y; u[id]=U[y]; D[u[y]]=id; u[y]=ID; loc[id][0]=x,loc[id][1]=y; C[id]=y; s[y]++; } if(!has)return; R[id]=first; l[first]=ID; } voidRemove (intSize) { for(intJ=D[SIZE];J!=SIZE;J=D[J])//connect the left and right sidesl[r[j]]=l[j],r[l[j]]=R[j]; } voidResume (intSize) { for(intJ=U[SIZE];J!=SIZE;J=U[J])//Recoveryl[r[j]]=r[l[j]]=J; } BOOLVIS[MS];//marks whether a row has been accessed intH ()//heuristic function { intret=0; inti,j,k; memset (Vis,0,sizeof(VIS)); for(i=r[0];i;i=R[i]) { if(Vis[i])Continue; RET++; for(J=d[i];j!=i;j=d[j])//all the associated tags are for(K=r[j];k!=j;k=r[k]) vis[c[k]]=1; } returnret; } voidDfsintStep) { if(Step+h () >=ans)return; if(r[0]==0) {ans=min (ans,step);return; } intmin=inf,c=-1; for(inti=r[0];i;i=r[i])if(Min>s[i]) {Min=s[i]; c=i;} for(intI=d[c];i!=c;i=D[i]) {Remove (i); for(intj=r[i];j!=i;j=R[j]) Remove (j); DFS (step+1); for(intj=l[i];j!=i;j=L[j]) Resume (j); Resume (i); } return; }}DLX;
View Code
Accurate coverage of DLX algorithm templates