“九宫填数“也叫“九方数”,古代称为“九宫算”。九宫填数是将九个有效数字填在九个方位格子里,要使每行、每列和每条对角线上的和都相等,即:横的三个数之和、竖的三个数之和与斜的三个数之和,都相等。在解这个题之前,先把九宫的方位问题明确了,以便讲行具体的阐述。
这个方位的确定与看地图的方位是一致的。由于要把1—9这九个数填在适当的格子里,这九个数之和是45,无论是横、竖、斜都是三个数,把45平均分成三行,每行三个数的和都是15(包括横、竖、斜)。每三个数的情况:横有3种,竖有3种,斜有2种,共8种。
只要知道三个数就可以枚举所有的数了;
1 #include<iostream>
2 using namespace std;
3 int b[10],a[10];
4 int main(){
5 int f = 0;
6 for (int i=1;i<10;i++){
7 if(i!=5)b[1]=i;
8 for (int j=1;j<10;j++)
9 {
10 b[5] = 5;
11 if(j!=i&&j!=5&&i!=5){
12 b[2] = j;
13 b[8] = 15 - b[2] - b[5];
14 b[3] = 15 - b[1] - b[2];
15 b[9] = 15 - b[1] - b[5];
16 b[7] = 15 - b[3] - b[5];
17 b[4] = 15 - b[1] - b[7];
18 b[6] = 15 - b[3] - b[9];
19 if(b[4]+b[5]+b[6]==15&&b[7]+b[8]+b[9]==15)
20 {
21 f = 0;
22 memset(a,0,sizeof(a));
23 for (int k=1;k<10;k++) a[b[k]]++;
24 for (int k=1;k<10;k++) if(a[k]<=0||a[k]>1){f = 1;break;}
25 if(f==0){
26 for (int k=1;k<10;k++)
27 {
28 cout<< b[k] <<' ';
29 if(k%3==0)cout << endl;
30 }
31 cout << endl;
32 }
33 }
34 }
35 }
36 }
37 system("pause");
38 return 0;
39 }
40
posted on 2010-06-30 08:14
路修远 阅读(479)
评论(0) 编辑 收藏 引用