Sudoku---hdu2676(数独DFS)
http://poj.org/problem?id=2676
递归深搜
#include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> #include<math.h> #include<iostream> using namespace std; #define N 100 #define INF 0xffffffff #define memset(a,b) memset(a,b,sizeof(a)) int a[15][15]; struct node { int x,y; } e[N]; int sum; int v1[N][N],v2[N][N],v3[N][N], ok; void DFS(int p) { if(p>sum) { ok=1; return; } for(int i=1; i<=9; i++) { if(!ok) if(v1[e[p].x][i]==0 && v2[e[p].y][i]==0 && v3[(e[p].x/3)*3+e[p].y/3][i]==0) { a[e[p].x][e[p].y]=i; v1[e[p].x][i]=1; v2[e[p].y][i]=1; v3[(e[p].x/3)*3+e[p].y/3][i]=1; DFS(p+1); // a[e[p].x][e[p].y]=0; v1[e[p].x][i]=0; v2[e[p].y][i]=0; v3[(e[p].x/3)*3+e[p].y/3][i]=0; } } } int main() { int T; scanf("%d ",&T); while(T--) { memset(v1,0); memset(v2,0); memset(v3,0); ok=sum=0; char str[N]; for(int i=0; i<9; i++) { scanf("%s",str); for(int j=0; j<9; j++) { a[i][j]=str[j]-'0'; if(a[i][j]!=0) { v1[i][a[i][j]]=1; v2[j][a[i][j]]=1; v3[(i/3)*3+j/3][a[i][j]]=1; } else { sum++; e[sum].x=i; e[sum].y=j; } } } DFS(1); for(int i=0; i<9; i++) { for(int j=0; j<9; j++) { printf("%d",a[i][j]); } printf("\n"); } } return 0; }