zoukankan      html  css  js  c++  java
  • 数独

    昨天听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
  • 相关阅读:
    位记录——Windows 7已安装Sublime Text 3、cynwin、SublimeClang
    尺度空间(Scale space)理论
    D3DXMatrixMultiply 函数
    素数推断算法(高效率)
    去除win7 64位系统桌面图标小箭头
    Bag标签之中的一个行代码实行中文分词实例1
    7个最好的免费杀毒软件下载
    利用Excel批量高速发送电子邮件
    Hibernate Criterion
    IOS新手教程(二)-控制流
  • 原文地址:https://www.cnblogs.com/Amphetamine/p/8420774.html
Copyright © 2011-2022 走看看