#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<map> #include<iomanip> #include<algorithm> #include<vector> #define INF 2e9 #define maxnode 100000 #define MP make_pair #define ll long long int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; using namespace std; struct DLX{ int up[maxnode],down[maxnode],left[maxnode],right[maxnode]; int row[maxnode],col[maxnode],s[1050],h[5000]; int n,m,size,ansd,ans[5000]; void init(int n1,int m1){ n=n1; m=m1; for(int i=0;i<=m;i++){ left[i] = i-1; right[i] = i+1; up[i] = down[i] = i; s[i]=0; } left[0]=m; right[m]=0; size=m; for(int i=1;i<=n;i++) h[i]=-1; } void link(int r,int c){ row[++size]=r; col[size]=c; s[c]++; up[size]=up[c]; down[size]=c; down[ up[c] ]=size; up[c]=size; if( h[r]==-1 ) left[size]=right[size]=h[r]=size; else{ left[size]=left[h[r]]; right[size]=h[r]; right[left[h[r]]]=size; left[h[r]]=size; } } void remove(int c){ right[left[c]]=right[c]; left[right[c]]=left[c]; for(int i=down[c];i!=c;i=down[i]){ for(int j=right[i];j!=i;j=right[j]){ up[down[j]]=up[j]; down[up[j]]=down[j]; s[ col[j] ]--; } } } void resume(int c){ right[left[c]]=c; left[right[c]]=c; for(int i=down[c];i!=c;i=down[i]){ for(int j=right[i];j!=i;j=right[j]){ up[down[j]]=j; down[up[j]]=j; s[ col[j] ]++; } } } bool dance(int d){ if( right[0]==0 ) return true; int c=right[0]; for(int i=c;i!=0;i=right[i]) if( s[i]<s[c] ) c=i; remove(c); for(int i=down[c];i!=c;i=down[i]){ ans[d] = row[i];//行的编号 for(int j=right[i];j!=i;j=right[j]) remove( col[j] ); if( dance(d+1) ) return true; for(int j=left[i];j!=i;j=left[j]) resume( col[j] ); } resume(c); return false; } }dlx; char board[10][10]; int slash[10][10]; struct node{ int r,c,num; node(int r1=0,int c1=0,int n1=0): r(r1),c(c1),num(n1) {} }biao[5000]; int main(){ //1-54 grid has number //54+(1-54) row has number num //108 + (1-54) col has number num //162+(1-54) 宫 has number num ios::sync_with_stdio(false); int t; cin>>t; while(t--){ int cnt=0; memset(slash,0,sizeof(slash)); int id1; cin>>id1; dlx.init(500,216); int id=0; for(int i=0;i<6;i++){ string s; int c=0; for(int j=0;j<6;j++){ cin>>s; int gong=(i/2)*2+(j/3); if( s.length()==3 ){ if( s[0]=='-' && s[2]=='-' ){ for(int k=1;k<=9;k++){ id++; dlx.link(id,i*9+c+1); dlx.link(id,54+i*9+k);//row dlx.link(id,108+j*9+k);//col dlx.link(id,162+gong*9+k); biao[id]=node(i,c,k); } for(int k=1;k<=9;k++){ id++; dlx.link(id,i*9+c+1+1); dlx.link(id,54+i*9+k);//row dlx.link(id,108+j*9+k);//col dlx.link(id,162+gong*9+k); biao[id]=node(i,c+1,k); } } else if( s[0]!='-' && s[2]!='-' ){ int num=int(s[0])-48; id++; dlx.link(id,i*9+c+1); dlx.link(id,54+i*9+num); dlx.link(id,108+j*9+num); dlx.link(id,162+gong*9+num); biao[id]=node(i,c,num); num=int(s[2])-48; id++; dlx.link(id,i*9+c+1+1); dlx.link(id,54+i*9+num); dlx.link(id,108+j*9+num); dlx.link(id,162+gong*9+num); biao[id]=node(i,c+1,num); } else if( s[0]=='-' && s[2]!='-' ){ int num=int(s[2])-48; //前面的要小于后面的 for(int k=1;k<num;k++){ id++; dlx.link(id,i*9+c+1); dlx.link(id,54+i*9+k);//row dlx.link(id,108+j*9+k);//col dlx.link(id,162+gong*9+k); biao[id]=node(i,c,k); } id++; dlx.link(id,i*9+c+1+1); dlx.link(id,54+i*9+num); dlx.link(id,108+j*9+num); dlx.link(id,162+gong*9+num); biao[id]=node(i,c+1,num); } else{ int num=int(s[0])-48; id++; dlx.link(id,i*9+c+1); dlx.link(id,54+i*9+num); dlx.link(id,108+j*9+num); dlx.link(id,162+gong*9+num); biao[id]=node(i,c,num); //第二个要大于第一个 for(int k=num+1;k<=9;k++){ id++; dlx.link(id,i*9+c+1+1); dlx.link(id,54+i*9+k);//row dlx.link(id,108+j*9+k);//col dlx.link(id,162+gong*9+k); biao[id]=node(i,c+1,k); } } slash[i][c]=1; board[i][c++]=s[0]; board[i][c++]=s[2]; } else { if( s[0]=='-' ){ for(int k=1;k<=9;k++){ id++; dlx.link(id,i*9+c+1); dlx.link(id,54+i*9+k);//row dlx.link(id,108+j*9+k);//col dlx.link(id,162+gong*9+k); biao[id]=node(i,c,k); } } else{ int num=int(s[0])-48; id++; dlx.link(id,i*9+c+1); dlx.link(id,54+i*9+num); dlx.link(id,108+j*9+num); dlx.link(id,162+gong*9+num); biao[id]=node(i,c,num); } board[i][c++]=s[0]; } } } dlx.dance(0); for(int i=0;i<54;i++){ node p=biao[ dlx.ans[i] ]; board[p.r][p.c]=char(48+p.num); } cout<<id1<<endl; for(int i=0;i<6;i++){ for(int j=0;j<9;j++){ if( slash[i][j] ) { if( board[i][j]>board[i][j+1] ){ char tmp=board[i][j+1]; board[i][j+1]=board[i][j]; board[i][j]=tmp; } cout<<board[i][j]<<"/"; } else cout<<board[i][j]<<" "; } cout<<endl; } } return 0; }
7788
猜你喜欢
转载自www.cnblogs.com/ZhenghangHu/p/9752270.html
今日推荐
周排行