
九宫图算法
所有的基数的平方宫图进行排列。古代计量数字的方法之一。在中国古典文献中记载了洛书的传说:公元前 23世纪大禹治水之时,一只巨大的神龟出现于黄河支流洛水中,龟甲上有9种花点的图案,分别代表这9个数,而3行、3列以及两对角线上各自的数之和均为15,世人称之为洛书。中国汉朝的数术记遗中,称之为九宫算,又叫九宫图.宋数学家杨辉着《续古摘奇算法》把类似于九宫图的图形命 名为纵横图,书中列举3、4、5、6、7、8、9、10阶幻方。其中所述三阶幻方构造法:“九子斜排,上下对易,左右相更,四维挺出,戴九履一,左七右三,二四为肩,六八为足”,比法国数学家Claude Gaspar Bachet提出的方法早三百余年。
基本介绍
- 中文名:九宫图算法
- 内容:所有的基数的平方宫图进行排列
- 性质:古代计量数字的方法之一
- 第一部:菱形斜填写
简介
在中国古典文献中记载了洛书的传说:公元前 23世纪大禹治水之时,一只巨大的神龟出现于黄河支流洛水中,龟甲上有9种花点的图案,分别代表这9个数,而3行、3列以及两对角线上各自的数之和均为15,世人称之为洛书。中国汉朝的数术记遗中,称之为九宫算,又叫九宫图.宋数学家杨辉着《续古摘奇算法》把类似于九宫图的图形命 名为纵横图,书中列举3、4、5、6、7、8、9、10阶幻方。其中所述三阶幻方构造法:“九子斜排,上下对易,左右相更,四维挺出,戴九履一,左三右七,二四为肩,六八为足”,比法国数学家Claude Gaspar Bachet提出的方法早三百余年。
实现步骤
第一步:菱形斜填写

第二步:菱形四角的3和7,1和9交换,如下图

第三步:9和1插队进去,如图

先将1—9九个数按如下图排列
1
4 b 2
7 c 5 a 3
8 d 6
9
然后将a用7代替,同理1换d,3换c,9换b
便可得如下排列:
4 9 2
3 5 7
8 1 6
此方法也可推导至所有的基数的平方宫图进行排列。
方法2:以中下格为起点,按右下为方向顺序填写(想像格子上下相连,左右相连),遇到右下格已占,填入正上方格内。
以25格为例:
11↘ | 18↘ | 25 | 2↘ | 9↘ 10填左方 |
10↑ 11填上方 | 12↘ | 19↘ | 21↘ | 3↘ 4填左方 |
4↘ | 6↘ | 13↘ | 20↑ 11填上方 | 22↘ 23填左方 |
23↘ | 5↑ 6填上方 | 7↘ | 14↘ | 16↘ 17填左方 |
17↘ 18填上方 | 24↘ 25填上方 | 1↘ 2填上方 | 8↘ 9填上方 | 15↑ 16填上方 |
算法实现
// 九宫图算法;
//////////////////////////////////////
#include<sio.h>
#include<time.h>
#include<slib.h>
//////////////////////////////////
//// the function defination
//////////////////////////////////
void create(int [][3]);
void show(int [][3]);
void set_value(int [][3]);
void aim_get(int [][3]);
void target(int [][3]);
void judge_x1(int [][3]);
void judge_x2(int [][3]);
void judge_x3(int [][3]);
void judge_x4(int [][3]);
void judge_x5(int [][3]);
void shift_all(int [][3]);
void shift_low_six(int [][3]);
void anti_shift_all(int [][3]);
void shift_low_four(int [][3]);
void last_shift(int [][3]);
void set_x5(int [][3]);
///////////////////////////////////////
////// the main function body ////
////////////////////////////////////////
main()
{
srand(time(NULL));
int cDiagram[3][3];
create(cDiagram); /////// creat the new array ,set the value are 10;
set_value(cDiagram);
//last_shift(cDiagram);
return 0;
}
///////////////////////////////////////
/// 建立一个3*3数组,初值都设为10;//
//////////////////////////////////////
void create(int array[][3])
{
printf("\n\n***********************************\n\n");
printf("九宫图算法实现过程\n\n");
printf("***********************************\n\n");
int line;
int row;
for(line=0;line<3;line )
{
for(row=0;row<3;row )
{
array[line][row]=10;
}
}
// set_value(array);
//show(array);
}
/////////////////////////////////////////
/// 显示数组状态 ////
////////////////////////////////////////
void show(int array[][3])
{
for(int i=0;i<3;i )
{
for(int j=0;j<3;j )
{
printf("=",array[i][j]);
}
printf("\n\n");
}
}
///////////////////////////////
/// 产生数组的初始状态 ///////
///////////////////////////////
void set_value(int array[][3])
{
int i=0;
int rand_num_line;
int rand_num_row;
printf(" \n\n九宫图的初始值为:\n\n");
while(i<=8)
{
rand_num_line=rand()%3;
rand_num_row=rand()%3;
if(array[rand_num_line][rand_num_row]!=i&& array[rand_num_line][rand_num_row]==10)
{
array[rand_num_line][rand_num_row]=i;
i;
}
}
show(array);
//printf(" let's begin!!\n");
aim_get(array);
}
////////////////////////////////////////////////////////
//// judge the initial array get the target or no ! ///
//////////////////////////////////////////////////////////
void aim_get(int array[][3])
{
int aim[3][3]={{1,2,3},{8,0,4},{7,6,5}};
int line;
int row;
int judge=0;
for(line=0;line<3;line )
{
for(row=0;row<3;row )
{
if(array[line][row]!=aim[line][row])
{
judge=1;
}
}
}
if(judge==1)
{
judge_x1(array);
}
else
{
target(array);
}
}
/////////////////////////////////////
/////// the target diagram //////////
/////////////////////////////////////
void target(int array[][3])
{
printf("\n\n the last diagram is :\n");
show(array);
}
////////////////////////////////////
///judge the x1 is 1 or no! ///////
////////////////////////////////////
void judge_x1(int array[3][3])
{
//int x1=1;
int temp;
//printf(" \n\n\n the array[0][2]=%d\n\n",array[0][2]);
if(array[0][2]!=1 && array[0][2]!=0) // x3!=1 || x3!=0;
{
while(array[0][0]!=1)
{
//printf("i am here!!1");
temp=array[0][0];
array[0][0]=array[0][1];
array[0][1]=array[1][1];
array[1][1]=array[1][2];
array[1][2]=array[2][2];
array[2][2]=array[2][1];
array[2][1]=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
}
else
{
if(array[0][2]==0) // x3==0;
{
// printf("\n\n array[0][2]=0\n\n");
temp=array[0][2];
array[0][1]=array[0][2];
array[0][2]=temp;
judge_x1(array);
goto tt;
}
else /// x3==1;
{ //printf("\n\narray[0][2] should is 1, %d",array[0][2]);
if(array[1][1]==0) //// x0==0;
{
temp=array[0][1];
array[0][1]=array[1][1];
array[1][1]=temp;
judge_x1(array);
}
else //// x3==1 && x0!=0;
{
shift_all(array);
judge_x1(array);
}
}
}
printf(" 确定了X1位置后,九宫图为:\n");