1.15 构造数独

编程之美讲了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     

第二种: 矩阵替换

随机在中间产生一个矩阵,然后分别变换行列就可以。代码思路比较简单,不再列述。

posted @ 2012-07-29 12:31  CBDoctor  阅读(317)  评论(0编辑  收藏  举报