Sudoku
POJ - 26761 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843
代码:
#include<stdio.h> #include<string.h> int mp[10][10],a[85][3],b[10][10],c[10][10]; int prime(int i,int j,int k) { int p,q; for(p=i/3*3;p<=i/3*3+2;p++) for(q=j/3*3;q<=j/3*3+2;q++) if(mp[p][q]==k) return 0; return 1; } int cmp(int w) { int i,j,k; j=a[w][0],k=a[w][1]; if(w<0) return 1; for(i=0;i<9;i++) { if(prime(j,k,i+1)&&!b[j][i]&&!c[k][i]) { b[j][i]=c[k][i]=1; mp[j][k]=i+1; if(cmp(w-1)) return 1; b[j][i]=c[k][i]=0; mp[j][k]=0; } } return 0; } int main() { int i,j,t,w; char s[10]; scanf("%d",&t); while(t--) { memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); w=0; for(i=0;i<9;i++) { scanf("%s",s); for(j=0;j<9;j++) { mp[i][j]=s[j]-'0'; if(!mp[i][j]) { a[w][0]=i; a[w][1]=j; w++; } if(mp[i][j]) b[i][mp[i][j]-1]=1; } } for(j=0;j<9;j++) for(i=0;i<9;i++) if(mp[i][j]) c[j][mp[i][j]-1]=1; cmp(w-1); for(i=0;i<9;i++) { for(j=0;j<9;j++) printf("%d",mp[i][j]); printf("\n"); } } return 0; }