7788

#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;    
}

猜你喜欢

转载自www.cnblogs.com/ZhenghangHu/p/9752270.html