“九宮填數(shù)“也叫“九方數(shù)”,古代稱為“九宮算”。九宮填數(shù)是將九個(gè)有效數(shù)字填在九個(gè)方位格子里,要使每行、每列和每條對(duì)角線上的和都相等,即:橫的三個(gè)數(shù)之和、豎的三個(gè)數(shù)之和與斜的三個(gè)數(shù)之和,都相等。在解這個(gè)題之前,先把九宮的方位問題明確了,以便講行具體的闡述。
這個(gè)方位的確定與看地圖的方位是一致的。由于要把1—9這九個(gè)數(shù)填在適當(dāng)?shù)母褡永铮@九個(gè)數(shù)之和是45,無論是橫、豎、斜都是三個(gè)數(shù),把45平均分成三行,每行三個(gè)數(shù)的和都是15(包括橫、豎、斜)。每三個(gè)數(shù)的情況:橫有3種,豎有3種,斜有2種,共8種。
只要知道三個(gè)數(shù)就可以枚舉所有的數(shù)了;
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
路修遠(yuǎn) 閱讀(487)
評(píng)論(0) 編輯 收藏 引用