九宮圖算法

九宮圖算法

九宮圖算法,所有的基數的平方宮圖進行排列。古代計量數字的方法之一。在中國古典文獻中記載了洛書的傳說:公元前23世紀大禹治水之時,一隻巨大的神龜出現於黃河支流洛水中,龜甲上有9種花點的圖案,分別代表這9個數,而3行、3列以及兩對角線上各自的數之和均為15,世人稱之為洛書。中國漢朝的數術記遺中,稱之為九宮算。

基本信息

簡介

中國古典文獻中記載了洛書的傳說:公元前23世紀大禹治水之時,一隻巨大的神龜出現於黃河支流洛水中,龜甲上有9種花點的圖案,分別代表這9個數,而3行、3列以及兩對角線上各自的數之和均為15,世人稱之為洛書。中國漢朝的數術記遺中,稱之為九宮算,又叫九宮圖.宋數學家楊輝著《續古摘奇算法》把類似於九宮圖的圖形命名為縱橫圖,書中列舉3、4、5、6、7、8、9、10階幻方。其中所述三階幻方構造法:“九子斜排,上下對易,左右相更,四維挺出,戴九履一,左三右七,二四為肩,六八為足”,比法國數學家ClaudeGasparBachet提出的方法早三百餘年。

實現步驟

九宮圖算法九宮圖算法
第一步:菱形斜填寫第二步:菱形四角的3和7,1和9交換第三步:9和1插隊進去先將1—9九個數按如下圖排列
1
4b2
7c5a3
8d6
9
然後將a用7代替,同理1換d,3換c,9換b
便可得如下排列:
492
357
816
此方法也可推導至所有的基數的平方宮圖進行排列。
方法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>
//////////////////////////////////
////thefunctiondefination
//////////////////////////////////
voidcreate(int[][3]);
voidshow(int[][3]);
voidset_value(int[][3]);
voidaim_get(int[][3]);
voidtarget(int[][3]);
voidjudge_x1(int[][3]);
voidjudge_x2(int[][3]);
voidjudge_x3(int[][3]);
voidjudge_x4(int[][3]);
voidjudge_x5(int[][3]);
voidshift_all(int[][3]);
voidshift_low_six(int[][3]);
voidanti_shift_all(int[][3]);
voidshift_low_four(int[][3]);
voidlast_shift(int[][3]);
voidset_x5(int[][3]);
///////////////////////////////////////
//////themainfunctionbody////
////////////////////////////////////////
main()
{
srand(time(NULL));
intcDiagram[3][3];
create(cDiagram);///////creatthenewarray,setthevalueare10;
set_value(cDiagram);
//last_shift(cDiagram);
return0;
}
///////////////////////////////////////
///建立一個3*3數組,初值都設為10;//
//////////////////////////////////////
voidcreate(intarray[][3])
{
printf("\n\n***********************************\n\n");
printf("九宮圖算法實現過程\n\n");
printf("***********************************\n\n");
intline;
introw;
for(line=0;line<3;line)
{
for(row=0;row<3;row)
{
array[line][row]=10;
}
}
//set_value(array);
//show(array);
}
/////////////////////////////////////////
///顯示數組狀態////
////////////////////////////////////////
voidshow(intarray[][3])
{
for(inti=0;i<3;i)
{
for(intj=0;j<3;j)
{
printf("=",array[i][j]);
}
printf("\n\n");
}
}
///////////////////////////////
///產生數組的初始狀態///////
///////////////////////////////
voidset_value(intarray[][3])
{
inti=0;
intrand_num_line;
intrand_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'sbegin!!\n");
aim_get(array);
}
////////////////////////////////////////////////////////
////judgetheinitialarraygetthetargetorno!///
//////////////////////////////////////////////////////////
voidaim_get(intarray[][3])
{
intaim[3][3]={{1,2,3},{8,0,4},{7,6,5}};
intline;
introw;
intjudge=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);
}
}
/////////////////////////////////////
///////thetargetdiagram//////////
/////////////////////////////////////
voidtarget(intarray[][3])
{
printf("\n\nthelastdiagramis:\n");
show(array);
}
////////////////////////////////////
///judgethex1is1orno!///////
////////////////////////////////////
voidjudge_x1(intarray[3][3])
{
//intx1=1;
inttemp;
//printf("\n\n\nthearray[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("iamhere!!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\narray[0][2]=0\n\n");
temp=array[0][2];
array[0][1]=array[0][2];
array[0][2]=temp;
judge_x1(array);
gotott;
}
else///x3==1;
{//printf("\n\narray[0][2]shouldis1,%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")。

相關詞條

相關搜尋

熱門詞條

聯絡我們