codevs 2924 数独挑战
水题。爆搜。写得比较丑。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<queue> #include<vector> typedef long long LL; using namespace std; int n=9,a[10][10],h[10][10],l[10][10],cx[10][10],xx[299],yy[299],cnt; int check(int i,int j) { int r; if(i<=3) {if(j<=3) r=1; else if(j>3&&j<7) r=2; else r=3;} else if(i>3&&i<7) {if(j<=3) r=4; else if(j>3&&j<7) r=5; else r=6;} else {if(j<=3) r=7; else if(j>3&&j<7) r=8; else r=9;} return r; } int dfs(int now) { if(now==cnt+1) return 1; int x=xx[now],y=yy[now],z=check(x,y); for(int i=1;i<=n;i++) if(!h[x][i]&&!l[y][i]&&!cx[z][i]){ a[x][y]=i; h[x][i]=l[y][i]=cx[z][i]=1; if(dfs(now+1)) return 1; h[x][i]=l[y][i]=cx[z][i]=0; a[x][y]=0; } return 0; } int main() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); int x=a[i][j]; if(x) { h[i][x]=1; l[j][x]=1; cx[check(i,j)][x]=1; } else xx[++cnt]=i,yy[cnt]=j; } dfs(1); for(int i=1;i<=n;i++) { for(int j=1;j<n;j++) printf("%d ",a[i][j]); printf("%d\n",a[i][9]); } return 0; }