HDU 3909 数独(二)
j]); } add(c); return 0; } void remove(int c){//重复覆盖 FF(i,D,c)L[R[i]]=L[i],R[L[i]]=R[i]; } void resume(int c){//重复覆盖 FF(i,U,c)L[R[i]]=R[L[i]]=i; } int A(){//估价函数 int res=0; memset(vis,0,sizeof(vis)); FF(i,R,0)if(!vis[i]){ res++;vis[i]=1; FF(j,D,i)FF(k,R,j)vis[col[k]]=1; } return res; } void dfs(int now,int &ans){//重复覆盖 if(R[0]==0)ans=min(ans,now); else if(now+A()
s[i])temp=s[i],c=i; FF(i,D,c){ remove(i);FF(j,R,i)remove(j); dfs(now+1,ans); FF(j,L,i)resume(j);resume(i); } } } }dlx; const int SLOT=0; const int ROW=1; const int COL=2; const int SUB=3; int encode(int a,int b,int c,int n){ if(n==2)return 16*a+4*b+c+1; if(n==3)return 81*a+9*b+c+1; if(n==4)return 256*a+16*b+c+1; } void decode(int code,int &a,int &b,int &c,int n){ code--;int pp=n*n; c=code%pp;code/=pp; b=code%pp;code/=pp; a=code; } char str[20][20]; int build(int n){ dlx.init(4*n*n*n*n); for(int r=0;r