数独

Posted on 2018-02-06 09:14  Amphetamine  阅读(222)  评论(0编辑  收藏  举报

昨天听WC讲搜素骗分,心血来潮写了一个解数独搜索,(很久以前就想自己写一个,网上其他人写的太瓜了)。

 

可以秒出任何数独,欢迎来hack我。

#include<bits/stdc++.h>
using namespace std;
int cnt;
int id[10][10];
int all=(1<<9)-1;
int a[10][10];
int num[1<<10];
void dfs(int dep){
    if(!dep){
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        exit(0);
    }
    int b[10][10],c[10][10],x=0,y=0,z=9;
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            if(!a[i][j]&&!id[i][j])return ;
            b[i][j]=a[i][j];c[i][j]=id[i][j];
            if(!a[i][j]){
                if(num[id[i][j]]<z)z=num[id[i][j]],x=i,y=j;
            }
        }
    }
    for(int i=0;i<9;i++)if(id[x][y]&(1<<i)){
        a[x][y]=i+1;        
        for(int k=1;k<=9;k++)id[k][y]&=((1<<9)-1-(1<<i));
        for(int k=1;k<=9;k++)id[x][k]&=((1<<9)-1-(1<<i));
        for(int k=(x-1)/3*3+1;k<=(x-1)/3*3+3;k++){
            for(int l=(y-1)/3*3+1;l<=(y-1)/3*3+3;l++){
                id[k][l]&=((1<<9)-1-(1<<i));
            }
        }
        dfs(dep-1);
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                id[i][j]=c[i][j],a[i][j]=b[i][j];
            }
        }
    }
    return ;
}
int main(){
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            id[i][j]=all;
        }
    }
    for(int i=1;i<=1023;i++)num[i]=__builtin_popcount(i);
    int x;
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++){
            scanf("%1d",&x);
            if(x)a[i][j]=x;
            if(x){
                for(int k=1;k<=9;k++)id[k][j]&=((1<<9)-1-(1<<x-1));
                for(int k=1;k<=9;k++)id[i][k]&=((1<<9)-1-(1<<x-1));
                for(int k=(i-1)/3*3+1;k<=(i-1)/3*3+3;k++){
                    for(int l=(j-1)/3*3+1;l<=(j-1)/3*3+3;l++){
                        id[k][l]&=((1<<9)-1-(1<<x-1));
                    }
                }
                cnt++;
            }
        }
    }
    cout<<endl;
    dfs(81-cnt);
    return 0;
} 
View Code