列表网_列表在线网
列表在线网 > 知识列表 >

九宫图算法

编辑:列表君 时间:2023-05-23 08:42:01来源:列表在线网

在中国古典文献中记载了洛书的传说:公元前 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↘252↘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

#include

#include

//////////////////////////////////

//// 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("***********************************");

printf("九宫图算法实现过程");

printf("***********************************");

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("");

}

}

///////////////////////////////

/// 产生数组的初始状态 ///////

///////////////////////////////

void set_value(int array[][3])

{

int i=0;

int rand_num_line;

int rand_num_row;

printf(" 九宫图的初始值为:");

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!!");

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(" the last diagram is :");

show(array);

}

////////////////////////////////////

///judge the x1 is 1 or no! ///////

////////////////////////////////////

void judge_x1(int array[3][3])

{

//int x1=1;

int temp;

//printf(" the array[0][2]=%d",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(" array[0][2]=0");

temp=array[0][2];

array[0][1]=array[0][2];

array[0][2]=temp;

judge_x1(array);

goto tt;

}

else /// x3==1;

{ //printf("array[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位置后,九宫图为:");

  • 上一篇:妖精兽
  • 下一篇:没有了

相关阅读