李建華,許芝卉
(山西大同大學(xué)數(shù)學(xué)與統(tǒng)計(jì)學(xué)院,山西大同 037009)
幻方是個(gè)古老的數(shù)字游戲,歷史悠久。它不僅在數(shù)學(xué)中占有一定的地位,而且在計(jì)算機(jī)科學(xué)中也有廣泛的應(yīng)用。n階幻方是指一個(gè)從1到的自然數(shù)組成的方陣,其每行、每列以及兩對(duì)角線上元素之和相等。目前,關(guān)于奇數(shù)階幻方構(gòu)造的方法已相當(dāng)豐富。
在文獻(xiàn)[1]中,作者給出了2n+1 階幻方構(gòu)造的傳統(tǒng)構(gòu)造方法,其構(gòu)造步驟為:
Step1:將1 放到第一行的中間;
Step2:其它2-(2n+1)×(2n+1)的數(shù)字依次放在前一個(gè)數(shù)字的上一行后一列的空格中。如果到達(dá)最上一行,則把數(shù)字放在最后一行后一列的方格中;如果到達(dá)最右端,則把數(shù)字放在第一列的上一行的方格中;按這個(gè)方法找到的位置已填有數(shù)字,則將此數(shù)放在前一個(gè)數(shù)的正下方的方格中。
用C程序?qū)崿F(xiàn)如下:
在文獻(xiàn)[2]中,給出了根據(jù)幻方的定義及其性質(zhì)利用先縱后橫錯(cuò)位構(gòu)造的方法對(duì)2n+1 階幻方的構(gòu)造[2],其構(gòu)造步驟為:
Step1:將(2n+1)×(2n+1)個(gè)數(shù)字放入2n+1 階矩陣中,從1 開(kāi)始,依次存放,按先行后列的順序存放;
Step2:先進(jìn)行列變換,從每一列起依次變換(中間列不參與變換),依次將本列移出上面的數(shù)字推接到此列的下面,第一列移一個(gè)數(shù)字,第二列依次移兩個(gè)數(shù)字,依此類(lèi)推;
Step3:然后進(jìn)行行變換。每一行(中間行不參與變換)依次往前推數(shù)字,前面推出去的數(shù)字接到后面。第一行推移一個(gè)數(shù)字,第二行推移兩個(gè)數(shù)字,依此類(lèi)推。
用C程序?qū)崿F(xiàn)如下:
運(yùn)行結(jié)果如圖1-4所示。
圖1 3階幻方
圖2 5階幻方
圖3 7階幻方
圖4 11階幻方
文獻(xiàn)[3]中提出了一種改進(jìn)的連續(xù)擺數(shù)法。這種方法的第一個(gè)數(shù)可以在任意位置,而且可以按人為的意愿選擇下一個(gè)數(shù)的位置,但其它數(shù)字都得遵循這個(gè)規(guī)律[3]。具體步驟如下。
step1:以奇數(shù)階幻方中心位置為坐標(biāo)原點(diǎn),建立坐標(biāo)系;
step2:將幻方中任意一格的位置用坐標(biāo)來(lái)表示,坐標(biāo)范圍從
step3:定義“起始向量”,表示1 的位置;
step4:定義“偏移向量”,表示一個(gè)數(shù)的位置到下一個(gè)數(shù)位置所指的方向,依次按順序填寫(xiě)其它數(shù)字;
step5:當(dāng)遇到要填入的格子中已經(jīng)被其它數(shù)字占據(jù),用“中斷向量”重新計(jì)算該數(shù)字的坐標(biāo),當(dāng)?shù)玫降淖鴺?biāo)超出范圍,用“模n加”的方法計(jì)算新的合理的坐標(biāo),并將該數(shù)字填入坐標(biāo)所對(duì)應(yīng)的位置;
step6:重復(fù)step 4 和step 5,直到所有數(shù)字入方格中。
這種填法需要特別注意:
中心數(shù)之前的數(shù)不能放入中心位置。一但中心數(shù)之前的數(shù)通過(guò)這種方法被放入中心位置,那么這個(gè)起始向量,或是偏移向量的選取不合適,必須進(jìn)行調(diào)整更換;
用C程序?qū)崿F(xiàn)如下:
運(yùn)行結(jié)果如圖5-7:
圖5 初始坐標(biāo)(0,-1),偏移量(2,1)的5階幻方
圖6 初始坐標(biāo)(2,-2),偏移量(3,1)的7階幻方
圖7 初始坐標(biāo)(3,4),偏移量(1,-2)的九9階幻方
幻方作為一種“思維體操”,可以培養(yǎng)人們學(xué)習(xí)數(shù)學(xué)的興趣,開(kāi)發(fā)智力,拓寬思路[4-5]。用C 程序來(lái)實(shí)現(xiàn)幻方的構(gòu)造,更有助于培養(yǎng)程序設(shè)計(jì)的邏輯思想。