由n階幻方問題想到的 zz

2021-06-05 15:49:50 字數 3095 閱讀 9012

由n階幻方問題想到的

前序最近在學習一些經典的演算法,搞得頭昏腦漲,就想換換腦子。在家裡的舊書堆裡面亂翻,無意中將一本具有十多年歷史的小學數學奧林匹克競賽的書發掘了出來,能放到現在挺不容易的,就拿起來隨便翻翻。看了看目錄,乙個個熟悉的問題又一次的展現在了我的面前,看著看著就翻到了n階幻方這塊(其實那時候我們不這麼叫)。記得當時學這個問題的時候就感覺特別有意思,現在看看也是如此,於是乎便誕生了本片文章。

本文用較大的篇幅先介紹了n階幻方,因為這個問題挺有意思。但是本文的重點卻在第二節---由n階幻方引發的思考。

目錄第一節 n階幻方問題

第二節 由n階幻方引發的思考

正文第一節 n階幻方問題

所謂n階幻方問題,俗稱「橫豎斜相加和相等」(我們當時就是這麼叫的)。用術語說就是:在乙個n行n列的方格表中,有1,2,3......n*n-1,n*n這n*n個整數,且其對角線、橫行、縱行的數字和都相等。

好了,在具體詳解該問題之前,我們先看個例子,熟悉一下,如下圖所示:

由上圖可知,幻方有奇數階幻方和偶數階幻方兩種,而偶數階幻方又分為4m階幻方和4m+2階幻方兩類。

1.奇數階幻方

我記得基數階幻方有個口訣,有了這個口訣,走遍奇數幻方都不怕。其實這個口訣也是實現奇數幻方的步驟。

奇幻七絕

先填上行正**,

依次斜填切莫忘。

上格沒有頂格填,

頂格沒有底格放。

我作**釋一下這首七絕。

ok,奇數幻方就講完了,就這麼簡單。權當找樂子!

2.偶數階幻方

說實話,偶數階幻方我一直以為只有一種,就是2*n階幻方問題。查了一下才知道偶數階幻方也分為兩小類。

①.4*n階幻方

4*n階幻方的生成其實很簡單,即對方格中對角線上的資料,先以一條對角線(稱對角線一)為對稱軸,交換另一對角線(稱對角線二)的資料;然後以對角線二為對稱軸,交換對角線一的資料。說的直白一點,假設矩陣名為magicsquare,就是交換magicsquare[i,j]和magicsquare[n-1-i,n-1-j]。老辦法,作圖來說明。圖如下:

好了,4*n階幻方也晚了,怎麼樣,簡單吧!自己動手試試吧。

②.4*n+2階幻方

4*n+2,乍一看就較4*n麻煩了,事實也是如此,不過它的思想也簡單。就是將4*n+2看做2*(2*n+1),這樣一來就轉化成了四個2*n+1求幻方。

附註:下面的我以6階幻方為例,那麼,4*n+2=6,所以n=1。

我通過描述每個步驟加上圖形的方式來表述4*n+2階幻方實現的過程。

第一步:把整個**分成4個(2*n+1)*(2*n+1)的小**,分別叫a,b,c,d。見下圖

第二步:這樣a,b,c,d個小**就成奇數幻方問題了。

①.將1,2,...,(2*n+1)*(2*n+1)這些數劃分給a,並對a實現奇數幻方;

②.將(2*n+1)*(2*n+1)+1,...,2*(2*n+1)*(2*n+1)這些數劃分給b,並對b實現奇數幻方;

③.將2*(2*n+1)*(2*n+1)+1,...3*(2*n+1)*(2*n+1)這些數劃分c,並對c實現奇數幻方;

④.將3*(2*n+1)*(2*n+1)+1,...4*(2*n+1)*(2*n+1)這些數劃分d,並對d實現奇數幻方。

見下圖

第三步:從a表中的中心(即第n行的magicsquare[n][n])開始,按照從左向右的方向,標出n個數,a表中的其他行則標出最左邊的n格中的數(在圖中用紅色背景標出)。並且將這些標出的數和c表中的對應位置互換。見下圖

第四步:在b表中的中心(如上解釋)開始,自右向左,標出n-1列,將b中標出的資料與d表中對應位置的資料交換。但是6階幻方中,n-1此時等於0,所以b與d不用做交換。

至此,這個幻方就成了,如下圖。

附註:以上幾個問題的程式就不送上了,有興趣的朋友可以自己寫一下。

第二節 由n階幻方想到的

幻方問題就說完了,比較一下我還是感覺奇數階幻方有意思,而且比偶數階幻方問題容易些,沒有那麼麻煩。按說寫到此本應該結束了,可是我突發奇想,n階幻方這個問題利用數學知識很容就能解決,那麼我想問一下大家:在平時寫程式思考演算法的時候,你是否會利用數學知識來解決問題呢?

假如這個問題讓你在限定的時間內程式設計來實現.如果你對n階幻方很了解,知道奇偶兩種情況的做法,好,那沒有問題,恭喜你!但是,恰巧你對n階幻方不是很了解,也不知道奇偶階幻方的做法,那這個問題你會怎麼解決?用列舉還是用其他什麼演算法。這是你不得不考慮的。

說到這,我又想到了乙個例子,如:求1,2,...,99,100的和,請程式設計實現。你會怎麼做?這個確實很簡單,我相信多數朋友都會用乙個for或是乙個while來解決問題。那還有沒有更簡單的辦法呢?當然有,利用數學知識來解決,1,2,...,99,100就是乙個等差數列,等差數列求和的公式s=(首項+末項)*項數/2,直接得出結果。哪個效率更高,不言而喻。所以說,數學知識在我們程式設計中很有用,只是我們經常考慮不到而已!

第三節 結束語

由n階幻方問題引發的思考

由n階幻方問題想到的 前序最近在學習一些經典的演算法,搞得頭昏腦漲,就想換換腦子。在家裡的舊書堆裡面亂翻,無意中將一本具有十多年歷史的小學數學奧林匹克競賽的書發掘了出來,能放到現在挺不容易的,就拿起來隨便翻翻。看了看目錄,乙個個熟悉的問題又一次的展現在了我的面前,看著看著就翻到了n階幻方這塊 其實那...

N(奇數)階幻方解法

3階8 1635 7492 5階17241 815235 714164 6132022 1012 1921311 182529 include includeusing namespace std const int n 9 定義階數,當前9階 該演算法只適合奇數階幻方 int main int a...

C語言的N階幻方

關於c語言的n階幻方問題 問題描述 所謂 n 階幻方是 1,2,n2 的方陣排列,且每行 每列和每條對角線上的和都相等。問題舉例 編寫程式列印 5x5 的幻方矩陣 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 現依...