编程之美-构造数独(1)
回溯法:
#include <stdio.h> #include <stdlib.h> #include <time.h> int isShudu(int shudu[9][9], int i, int j) { int k; int temp=shudu[i][j]; int flag=1; for(k=0; k<9; ++k) { if (k!=i && shudu[k][j]==temp) { flag=0; } } for(k=0; k<9; ++k) { if (k!=j && shudu[i][k]==temp) { flag=0; } } int p = i/3; int q = j/3; int m; int n; for(m=p*3; m<p*3+3; m++) { for(n=q*3; n<q*3+3; n++) { if(m!=i && n!=j && shudu[m][n]==temp) { flag=0; } } } return flag; } void outPut(int shudu[9][9]) { int i; int j; for(i=0; i<9; ++i) { for (j=0; j<9; ++j) { printf("%d ", shudu[i][j]); } printf("\n"); } } int main() { int shudu[9][9]={0}; int i; int j; int k=0; srand(time(0)); for (i=1; i<=9; ++i) { int temp=rand()%81; shudu[temp/9][temp%9]=i; } while (1) { i=k/9; j=k%9; while(1) { ++shudu[i][j]; if (shudu[i][j]>9) { shudu[i][j]=0; --k; break; } if (isShudu(shudu, i ,j)==1) { ++k; break; } } if(81==k) { outPut(shudu); break; } } return 0; }