BSOJ : 2637 【模擬試題】數獨

Description
  There is really only one rule:

  Fill in the grid so that
  every row,
  every column, and
  every 3 x 3 box
  contains the digits 1 through 9.

  這個遊戲只有一個規則:

  將格子填滿使得
  每一行,
  每一列,和
  每一個小的九宮格
  恰好包含1-9這9個數字

  正是由於規則簡單而又變化多端,數獨一時間風靡全球。
  現在,我們希望你能編寫一個程序解決數獨問題。
Input
  輸入數據一共9行,每行有9個字符。
  輸入數據描述了一個待解決的數獨,其中,“?”表示數獨中的空缺。
  我們的輸入數據總保證有唯一解。
Output
  輸出一共9行,每行9個數字,表示你的答案。
Sample Input
5????7??6
?6????5?4
?834?????
???182?4?
??1???9??
?7?369???
?????543?
1?5????9?
7??2????1
Sample Output
514927386
967831524
283456179
659182743
321574968
478369215
892615437
135748692
746293851
題庫裏唯一一道數獨:
。。
暴力解法都能過,
剛學了DLX。
拿來練練手。
DLX的詳細資料網上都有,
我也就不獻醜了。
我模仿的劉汝佳的風格。
挺優美的。
代碼如下:

#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<vector>
using namespace std;
int Slot=0;
int Row=1;
int Con=2;
int Sub=3;
const int Maxn=9*9*4*9*9*9;
int U[Maxn];
int D[Maxn];
int R[Maxn];
int L[Maxn];
int S[9*9*4];
int row[Maxn];
int con[Maxn];
int size=0;
int yama(int a,int b,int c){
    return a*81+b*9+c+1;
}
int jiema(int val,int &a,int &b,int &c){
    val--;
    c=val%9;
    val/=9;
    b=val%9;
    val/=9;
    a=val;
}
void init(int n){
    for(int i=0;i<=n;i++){
        R[i]=i+1;
        L[i]=i-1;
        U[i]=i;
        D[i]=i;
    }
    L[0]=n;
    R[n]=0;
    size=n+1;
}
void ins(int r,vector<int> Q){
    int first=size;
    for(int i=0;i<Q.size();i++){
        int c=Q[i];
        R[size]=size+1;L[size]=size-1;
        U[size]=U[c];D[size]=c;
        D[U[c]]=size;U[c]=size;
        row[size]=r;con[size]=c;
        S[c]++;size++;
    }
    L[first]=size-1;R[size-1]=first;
}
void del(int v){
    R[L[v]]=R[v];
    L[R[v]]=L[v];
    for(int i=D[v];i!=v;i=D[i])
    for(int j=R[i];j!=i;j=R[j]){
        U[D[j]]=U[j];
        D[U[j]]=D[j];
        S[con[j]]--;
    }
}
void restore(int v){
    for(int i=U[v];i!=v;i=U[i])
    for(int j=L[i];j!=i;j=L[j]){
        U[D[j]]=j;
        D[U[j]]=j;
        S[con[j]]++;
    }
    R[L[v]]=v;
    L[R[v]]=v;
}
int ans[9*9];
int Map[10][10];
void print(){
    for(int i=0;i<9*9;i++){
        int a,b,c;
        jiema(ans[i],a,b,c);
        Map[a][b]=c;
    }
    for(int i=0;i<9;i++){
        for(int j=0;j<9;j++)printf("%d",Map[i][j]+1);
        printf("\n");
    }
    printf("\n");
}
bool dfs(int d){
    if(R[0]==0){
        return true;
    }
    int c=R[0];
    for(int i=R[0];i!=0;i=R[i])if(S[i]<S[c])c=i;
    del(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])del(con[j]);
        if(dfs(d+1))return true;
        for(int j=L[i];j!=i;j=L[j])restore(con[j]);
    }
    restore(c);
    return false;
}
char ch[12][12];
int main(){
    for(int i=0;i<9;i++)
    scanf("%s",ch[i]);
    init(9*9*4);
    for(int i=0;i<9;i++)
    for(int j=0;j<9;j++)
    for(int v=0;v<9;v++)
    if(ch[i][j]=='?'||ch[i][j]=='1'+v){
        vector<int> Q;
        Q.push_back(yama(Slot,i,j));
        Q.push_back(yama(Row,i,v));
        Q.push_back(yama(Con,j,v));
        Q.push_back(yama(Sub,(i/3)*3+j/3,v));
        ins(yama(i,j,v),Q);
    }
    if(dfs(0));
    print();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章