编程之美讲了2中构造数独的方法,参照网上已有的代码,整理了一下。
第一种:回溯法
1 #include <iostream> 2 #include "stdlib.h" 3 #include <time.h> 4 5 #define LEN 9 6 7 using namespace std; 8 9 int CheckData(int array[][LEN],int i,int j) 10 { 11 int temp = array[i][j]; 12 int p, q; 13 int m, n; 14 15 for(p=0; p<9; p++) 16 if(p!=i && array[p][j]==temp) 17 return 0; 18 for(p=0; p<9; p++) 19 if(p!=j && array[i][p]==temp) 20 return 0; 21 p = i/3; 22 q = j/3; 23 for(m=p*3; m<p*3+3; m++) 24 for(n=q*3; n<q*3+3; n++) 25 if(m!=i && n!=j && array[m][n]==temp) 26 return 0; 27 return 1; 28 } 29 30 31 32 33 void main() 34 { 35 int sudoku[LEN][LEN] = {0}; 36 int temp = 0; 37 srand(time(0)); 38 for (int i = 0;i < 9;i++) 39 { 40 /*随机产生一个0~81之间的一个数*/ 41 /*在一些随机位置添加一些数*/ 42 temp = rand()%81; 43 sudoku[temp/9][temp%9]= i+1; 44 } 45 46 /*第一行第一列开始逐个检查,判断是否满足条件*/ 47 int k = 0; 48 49 while(1) 50 { 51 int m = k/9; //行信息 52 int n = k%9; //列信息 53 while(1) 54 { 55 sudoku[m][n]++; 56 if (sudoku[m][n] == 10) 57 { 58 sudoku[m][n] = 0; 59 --k; 60 break; 61 } 62 else if (CheckData(sudoku,m,n)) 63 { 64 ++k; 65 break; 66 } 67 68 if (k == 81) 69 break; 70 71 72 } 73 if (k == 81) 74 break; 75 76 } 77 78 //显示数据 79 80 while(1) 81 { 82 for (i =0;i<9;i++) 83 { 84 for (int j = 0;j <9;j++) 85 { 86 cout<<' '<<' '<<' '<<sudoku[i][j]; 87 } 88 cout<<endl; 89 } 90 if ( i == 9) 91 break; 92 93 94 95 } 96 } 97
第二种: 矩阵替换
随机在中间产生一个矩阵,然后分别变换行列就可以。代码思路比较简单,不再列述。