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

  

原文地址:https://www.cnblogs.com/acmood/p/4451982.html