• DXL数独~感觉萌萌哒~


    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int M = 100005;
    const int N = 16;
    struct DLX{
        int D[M], U[M], R[M], L[M], head[5000], S[5000], col[M], row[M];
        int ans[5025];
        int sz, ansd;
        void init(int tn){
            sz = tn;
            for(int i = 0; i <= tn; i ++) {
                D[i] = U[i] = i;
                L[i] = i-1; R[i] = i+1;
            } L[0] = tn; R[tn] = 0;
            memset(S, 0, sizeof(S));
            memset(head, -1, sizeof(head));
            head[0] = 0;
        }
        void Insert(int r, int c){
            ++S[col[++sz] = c];
            row[sz] = r;
            D[sz] = D[c];
            U[D[c]] = sz;
            U[sz] = c;
            D[c] = sz;
            if(head[r] < 0) head[r] = L[sz] = R[sz] = sz;
            else{
                R[sz] = R[head[r]];
                L[R[head[r]]] = sz;
                L[sz] = head[r];
                R[head[r]] = sz;
            }
        }
        void remove(int c){
            L[R[c]] = L[c]; R[L[c]] = R[c];
            for(int i = D[c]; i != c; i = D[i]){
                for(int j = R[i]; j != i; j = R[j]){
                    U[D[j]] = U[j];
                    D[U[j]] = D[j];
                    --S[col[j]];
                }
            }
        }void resume(int c){
            for(int i = U[c]; i != c; i = U[i]){
                for(int j = L[i]; j != i; j = L[j]) ++S[col[U[D[j]] = D[U[j]]=j]];
            }
            L[R[c]] = R[L[c]] = c;
        }
        bool Dance(int d){
            if(R[0] == 0){
                ansd = d;
                return true;
            }
            int c = R[0];
            for(int i = R[0]; i != 0; i = R[i]) if(S[i] < S[c]) c = i;
            remove(c);
            for(int i = D[c]; i != c; i = D[i]){
                ans[d] = row[i];
                for(int j = R[i]; j != i; j = R[j]) {
                    remove(col[j]);
                }
                if(Dance(d+1)) return true;
                for(int j = L[i]; j != i; j = L[j]) resume(col[j]);
            }
            resume(c);
            return false;
        }
    } g;
    
    char s[17][18];
    void print(){
        for(int i = 0; i < g.ansd; i ++){
            g.ans[i] --;
            int num = g.ans[i] % N; int y = g.ans[i]/N%N;
            int x = g.ans[i] /N/N;
            s[x][y] = num + 'A';
        }
        for(int i = 0; i < N; i ++) printf("%s
    ", s[i]);
    }
    
    int main(){
        int f = 1;
        while(scanf("%s", s[0]) != EOF){
            if(f) f = 0;
            else printf("
    ");
            for(int i = 1; i < N; i ++) scanf("%s", s[i]);
            g.init(1024);
            for(int i = 0; i < N; i ++){
                for(int j = 0; j < N; j ++){
                    for(int o = 0; o < N; o ++){
                        if(s[i][j] == '-' || s[i][j] == 'A' + o){
                            g.Insert((i*N+j)*N+o+1, i*N+j+1);
                            g.Insert((i*N+j)*N+o+1, N*N+o+i*N+1);
                            g.Insert((i*N+j)*N+o+1, N*N*2+o+j*N+1);
                            g.Insert((i*N+j)*N+o+1, N*N*3+o+((i/4)*4+j/4)*N+1);
                        }
                    }
                }
            }
            bool flag = g.Dance(0) ;
            print();
        }
        return 0;
    }
    

      

  • 相关阅读:
    忘记自己的密码了!
    MySQL ('root'@'%') does not exist的问题
    用视觉的差异和统一来表现界面信息(转)
    Localhost 本地mysql启动2013错误(windows系统下)
    修改SQL Server2005 sa密码方法
    .net中禁用TextBox和Input框的粘贴功能
    使用Visual Studio的搜索功能时间简单的代码量统计
    visifire3.6.4 以上版本去水印的办法
    网页设计的配色和排版(转)
    小米科技增设电商业务线,大家注意到没
  • 原文地址:https://www.cnblogs.com/acmood/p/4451982.html
Copyright © 2020-2023  润新知