• 数独


    昨天听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
  • 相关阅读:
    Ubuntu 14.04的SWAP 为0
    堆和栈的区别(转过无数次的文章)
    加法乘法判断溢出(转)
    大端格式、小端格式(转)
    Linux 目录操作和4中文件拷贝效率测试
    Linux使用标准IO的调用函数,分3种形式实现
    支持 onload 事件的元素
    $().each() 和 $.each()
    npm install --save 与 npm install --save-dev 的区别
    <!DOCTYPE html>作用
  • 原文地址:https://www.cnblogs.com/Amphetamine/p/8420774.html
Copyright © 2020-2023  润新知