昨天听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; }