第一篇:魔方陣 實驗報告
<< 魔方陣 >>實驗報告
一. 實驗目的
1.設計數(shù)據(jù)結構;
2.設計算法完成任意n階魔方陣的填數(shù); 3.分析算法的時間復雜度。
二. 實驗內(nèi)容
魔方陣,又叫幻方陣,在我國古代稱為“縱橫圖”。它是在一個n*n的矩陣中填入1到n*n的數(shù)字(n為奇數(shù)),使得每一行,每一列,每條對角線的累加和都相等。
三. 程序代碼
源程序:
#include
int p=0, q=(n-1)/2;
a[0][q]=1;
//在第0行的中間位置填1
for(int i=2;i<=n*n;i++)
{
p=(p-1+n)% n;
//求i所在行號
q=(q-1+n)% n;
//求i所在列號
if(a[p][q]>0){
p=(p+2)%n;q=(q+1)%n;
//這兩句進行了修改,否者得不到正確的答案,切記切記??!
}//如果位置(p, q)已經(jīng)有數(shù),填入同一列下一行
a[p][q]=i;
}
for(p=0;p {for(q=0;q cout< cout<<'n';} } void main(){ int n;cout<<“請輸入魔方矩陣的階數(shù)n=(n為奇數(shù)且<=9):”;cin>>n;cout<<“魔方陣的排列結果為:n”; Square(n);} 四.結果與心得體會 1.程序的測試結果是什么? 答:n=3時 n=5時 2.在調試的過程中遇到了什么問題,是如何解決的? 答:在調試的過程中遇到了以下幾個問題: 1.Square函數(shù)的形式參數(shù)不可以是(int a[][], int n),因為程序是在編譯時就會為數(shù)組分配內(nèi)存,而那樣的形式參數(shù)是不合理的。在調試程序的過程中,我反復試了好多次,也證明了那是錯的。解決方法:直接將Square函數(shù)的形參設為(int n),改在在其函數(shù)內(nèi)定義數(shù)組a[9][9],這樣就能將問題很好的解決。 2.在書中提供的Square函數(shù)里面,有一個語句是這樣的if(a[p][q]>0) p=(p+1)%n;,這個語句是錯的。之所以會有這樣的錯誤,是由于錯誤的理解了“如果位置(p, q)已經(jīng)有數(shù),填入同一列下一行”這一句的意思,這句的意思是填入原數(shù)的下面,而不是即將填入的那個數(shù)但又已填入數(shù)的那個數(shù)的下面。 解決方法:將該語句改成: if(a[p][q]>0) { p=(p+2)%n;q=(q+1)%n; },這樣就可以了。 3.由于數(shù)組a[][]是在Square函數(shù)中定義的,因此將數(shù)組數(shù)據(jù)輸出的語句就只能放在Square函數(shù)中實現(xiàn)。 C語言程序設計教案 奇數(shù)階魔方陣 一、提出問題 所謂“奇數(shù)階魔方陣”是指n為不小于3的奇數(shù)的魔方陣。這類魔方陣的形式多樣,這里我們僅討論其中的一種形式的正規(guī)魔方陣。例如:3階、5階和7階的魔方陣如圖3 – 4 所示。 3039*********416357,46132022,***2192***211***2414322314049圖3 – 4 3階5階和7階魔方陣 ***5 44431211202容易知道,這三個魔方陣的魔方常數(shù)分別是15、65和175。 現(xiàn)在要求給出:能讓計算機自動輸出類似圖3 – 4 所示的n階奇數(shù)魔方陣的算法,其中n為任意給定的一個不小于3的奇數(shù)。 二、簡單分析 決定“奇數(shù)階魔方陣”的關鍵是要按要求決定其方陣中的各個數(shù)字。觀察圖3 – 4中的三個奇數(shù)階魔方陣,不難發(fā)現(xiàn): 1.由于是正規(guī)魔方,故所填入的n 2個不同整數(shù)依次為1、2、3、…、n 2 ; 2.各行、列和對角線上的數(shù)字雖各不相同,但其和卻是相同的。這表明,其魔方常數(shù)可由公式n(n 2 + 1)/ 2得到。 3.數(shù)字在陣列中的次序,并沒有遵從陣列單元的行、列下標的順序,但數(shù)字“1”卻始終出現(xiàn)在陣列第一行的正中間位置,而數(shù)字“n 2”也始終出現(xiàn)在陣列第n行的正中間位置,這說明陣列中的數(shù)字排列應該是有一定規(guī)律的。 通過對兩個奇數(shù)階魔方陣的簡單分析,下面幾個基本問題必須得到解決: ◆ 奇數(shù)階魔方陣中的數(shù)字有些什么規(guī)律? ◆ 數(shù)字“1”的位置應如何確定? C語言程序設計教案 三、設計準備 1.奇數(shù)階魔方陣中的數(shù)字規(guī)律 通過對奇數(shù)階魔方陣的分析,其中的數(shù)字排列有如下的規(guī)律:(1)自然數(shù)1出現(xiàn)在第一行的正中間; (2)若填入的數(shù)字在第一行(不在第n列),則下一個數(shù)字在第n行(最后一行)且列數(shù)加1(列數(shù)右移一列); (3)若填入的數(shù)字在該行的最右側,則下一個數(shù)字就填在上一行的最左側;(4)一般地,下一個數(shù)字在前一個數(shù)字的右上方(行數(shù)少1,列數(shù)加1); (5)若應填的地方已經(jīng)有數(shù)字或在方陣之外,則下一個數(shù)字就填在前一個數(shù)字的下方。(一般地,n的倍數(shù)的下一個數(shù)字是在該數(shù)的下方。) 816按照上述的規(guī)律,我們來完成3階的魔方陣:357 4921第一步:將“1”填入1行2列的位置,即(按規(guī)律(1)); 1第二步:將“2”填入3(最后)行3(= 2 + 1)列的位置,即 (按規(guī)律 2(2)); 1第三步:將“3”填入2行1列的位置,即3(按規(guī)律(3)); 21第四步:將“4”填入3行1列的位置(“3”的下面);即3(按規(guī)律(5)) 422 C語言程序設計教案 1第五步:將“5”填入2行2列的位置;即35216(按規(guī)律(4)); 4第六步:將“6”填入1行3列的位置,即352(按規(guī)律(4)); 416第七步:將“7”填入2行3列的位置(“6”的下面),即357(按規(guī)律(5)); 42816第八步:將“8”填入1行1列的位置,即357(按規(guī)律(3)); 42816第九步:將“9”填入3行2列的位置,即357(按規(guī)律(2))。492至此,一個3階魔方陣構造完成了。2.數(shù)字“1”的位置確定方法 由于數(shù)字“1”要填寫在魔方陣第一行的正中間,因此我們只需要確定第一行的正中間單元的列下標即可。 考慮到對于一個奇數(shù)階魔方陣來說,它的每一行都有奇數(shù)個位置,所以“正中間的位置”就必然存在。容易知道,一個n(為奇數(shù))階魔方陣第一行的正中間單元的列下標為整數(shù)(n + 1)/ 2。于是數(shù)字“1”應填寫在魔方陣列的第1行第(n + 1)/ 2列處。 C語言程序設計教案 四、實施步驟 1.算法編制的工作順序: 有了上述的設計準備,我們所要的算法可按如下的工作順序編制: 第一步:輸入魔方陣的階數(shù)n(為奇數(shù)),并以此定義一個二維數(shù)組; 第二步:確定所謂“正中間位置”的列下標值,以及應填入的最大數(shù)字; 第三步:進行完成魔方陣的填寫工作; 第四步:輸出已完成的奇數(shù)階魔方陣。2.變量設置: N :表示魔方陣的階數(shù)(為奇數(shù)); A :表示魔方陣的二維數(shù)組; I :數(shù)組A的行序號; J :數(shù)組A的列序號; R :填入的數(shù)字; S :對角線上各數(shù)字之和。 3.參考框圖:如圖3 – 5 所示。4.框圖說明:整個框圖應分為三個功能部分: 第一個部分的功能是完成奇數(shù)N的輸入,并定義二維數(shù)組,完成有關元素的數(shù)值計算,同時能實現(xiàn)當N不是奇數(shù)時自動結束。圖3 – 5 處理“奇數(shù)階魔方陣”問題的框圖 第二個部分的功能是完成魔方陣的填寫工作。 填寫并不是按數(shù)組A的下標順序進行,而是通過對有關規(guī)律的判斷確定下標I和J的不同值來進行。其中涉及到了判斷“R是N的整數(shù)倍?”,這可以通過判斷是否有等式R – INT(R / N)? N = 0 成立來實現(xiàn)。 第三個部分的功能是完成輸出魔方陣和計算相應魔方常數(shù)的工作。 計算相應魔方常數(shù)的工作是通過對魔方陣的對角線中各元素數(shù)值來實現(xiàn),即在準備輸出打印元素A(I , I)時,通過累加方式S = S + A(I , I)來實現(xiàn)。 C語言程序設計教案 5.參考算法 第01步:輸入非負整數(shù)N,并定義數(shù)組 A(N , N); 第02步:若 N – INT(N / 2)? 2 = 0,則結束。第03步:讓J ?(N + 1)/ 2 , C ? N ? N , 且I ? 1; 第04步:讓 R ? 1; 第05步:若R > C , 則執(zhí)行第16步; 第06步:讓 A(I , J)? R; 第07步:若R – INT(R / N)? N = 0 , 則執(zhí)行第13步; 第08步:讓I ? I – 1 ; 第09步:若I + 1 = 1,則讓I ? N; 第10步:讓J ? J + 1; 第11步:若J – 1 ? N,則執(zhí)行第15步; 第12步:讓J ? 1 , 并執(zhí)行第15步; 第13步:讓I ? I + 1。若I – 1 ? N,執(zhí)行第15步; 第14步:讓I ? 1 ; 第15步:讓R ? R + 1,執(zhí)行第05步; 第16步:讓 S ? 0 , I ? 1 ; 第17步:若I > N , 則執(zhí)行第24步 ; 第18步:讓 S ? S + A(I , I); 第19步:讓J ? 1; 第20步:若J > N , 則執(zhí)行第13步; 第21步:在位置 4 J 處輸出 A(I , J); 第22步:讓J ? J + 1,并執(zhí)行第20步; 第23步:換行,讓I = I + 1 , 并執(zhí)行第17步; 第24步:輸出 S,結束。 參考算法的編制與框圖稍有不同,但功能是一樣的。其中: 第01步至第03步為第一部分,完成奇數(shù)的輸入,以及有關的準備工作。當輸入的N不是奇數(shù)時,會自動結束。第04步至第15步完成魔方陣的填寫工作。第16步至第24步完成輸出魔方陣和計算相應魔方常數(shù)的工作。 C語言程序設計教案 五、評估反思 應當說,奇數(shù)階魔方陣的形式是多種多樣的,這里我們僅僅只對其中的一種形式加以討論。這里所編制的參考算法從理論上看可以實現(xiàn)對指定形式的任何大小“奇數(shù)階魔方陣”的輸出,但在實際輸出時應考慮輸出設備的相關條件。 在參考算法中,第04步至第15步這部分是整個算法的核心部分,其功能是完成整個魔方的數(shù)字填入工作,因此其編制的思想、用到的一些處理方陣元素的技巧和經(jīng)驗,應引起我們的注意。 1.充分利用規(guī)律間共同特性。 在這部分里我們通過若干次對下標值的判斷,巧妙地將奇數(shù)階魔方陣應當遵循的規(guī)律(2)、(3)和(4)結合起來,使魔方陣的填寫工作能得以順利進行。這是因為奇數(shù)階魔方陣要求的五個規(guī)律中,規(guī)律(2)、(3)和(4)與單元的下標有直接的關系。 2.選擇首次判斷對象的要求。 在這部分里我們首先進行的是對填入數(shù)字R是否是階數(shù)N的整數(shù)倍的判斷,這實際上是將奇數(shù)階魔方陣的規(guī)律(5)作為主要的判斷標準。那么為什么不用另外的四個規(guī)律來作為主要的判斷標準呢?這主要是考慮到對于要填入的數(shù)字,在奇數(shù)階魔方陣的五個規(guī)律中,只有規(guī)律(5)將該數(shù)字直接與階數(shù)聯(lián)系起來,而另外四個規(guī)律則沒有(僅僅與填入單元的下標值有直接的聯(lián)系)。這告訴我們,算法的編制應注意那些具有單一性特點的事實、特性或規(guī)律等等。 3.有關魔方常數(shù)的得到。 要得到魔方常數(shù),最直接的方法是通過公式S = n(n 2 + 1)/ 2來計算,但這樣做不能顯示整個魔方陣的構造是否正確。在參考算法中,我們是通過累加魔方陣對角線中各元素數(shù)值來實現(xiàn)的,這樣做的好處有,其一是體現(xiàn)了數(shù)字累加方式在算法編制中的作用,其二是顯示了所構造的魔方陣是否正確。當然,我們也可以通過累加魔方陣某行或某列中各元素數(shù)值來實現(xiàn),只不過設計的步驟要稍多一些,因為需要從n行(列)中確定某行(列)的步驟。 4.關于魔方陣的驗證。 本參考算法中沒有設計利用魔方常數(shù)來判斷所完成的方陣是否是魔方陣的步驟,但設計這一功能并不困難。比較方便的做法可以為:在第一部分加入用公式計算魔方常數(shù)的步驟,將第三部分分成輸出方陣和驗證方陣兩部分。在驗證部分里,設計分別計算各行、各列及對角線中各數(shù)字和的步驟,以及將這些數(shù)字和與前面計算出的魔方常數(shù)進行比較的步驟。若對此有興趣,不妨自己動手試試。 C語言程序設計教案 六、要點回顧 1.數(shù)學思想:構成奇數(shù)階魔方陣應當遵循的五個規(guī)律; 2.常用公式:判斷“R是N的整數(shù)倍”的等式R – INT(R / N)? N = 0 ; 3.算法技巧:利用累計方式計算魔方常數(shù)和完成魔方陣輸出的方法。4.實用方法:判斷整數(shù)R是否是整數(shù)N的整數(shù)倍的方法。 方陣解說詞 英姿颯爽 神采飛揚,昂首闊步,意氣風發(fā)!迎面走來的是能源學院方隊,挺拔的身姿迎著金秋的微風,明凈的臉上洋溢著青春的自信! 聽,嘹亮的聲音,昭示出他們的蓬勃朝氣;看,炯炯的目光,展示著他們的自信剛強。他們用青春的激情放飛明天的夢想;他們用拼搏的精神譜寫今朝的輝煌!炎炎烈日下,他們勤學苦練;綿綿陰雨中,他們穩(wěn)扎穩(wěn)打。待到風云齊聚會,便上青天摘玉盤。今天,他們在汗水中磨練意志。明天,他們將為母校增光添彩! 四(2)班解說詞 : 披著晨光,帶著朝露,踏著青春的步伐,伴著激揚的旋律,四<2>班向我們走來。他們個個精神飽滿,英姿颯爽。整齊的步伐踏著他們的堅定,燦爛的微笑寫著他們的熱情,嘹亮的口號體現(xiàn)著他們的實力。他們團結友愛,勤奮好學。讓我們一起衷心的祝愿,祝愿4<2>班取得優(yōu)異的比賽成績! 1.水碧云天,秋風勁朗。旌旗蔽空,戰(zhàn)鼓擂響。且看人文學院方陣的戰(zhàn)士們英姿颯爽!十四天早出晚歸,他們在血汗里種下堅韌;十四天風雨同舟,他們在磨礪中收獲成長!晨鐘暮鼓,是他們鐵一般的秩序;披星戴月,是他們鋼一般的堅強!用傷疤雕刻勛章,用汗水鑄造輝煌。博學篤行傳薪火,厚德重法弦歌昂。九州英才聚華電,共譜人文新華章!看我人文學子今朝揮劍破云,揚眉四方,旗開得勝,獨擅勝場! 2.回響在操場上空的震天口號,蕩漾著熱血青年力爭上游的壯志豪情,現(xiàn)在走來的是人文學院的隊列方陣。訓練場上,他們揮汗如雨,以苦為樂。烈日下?lián)]拳踢腿,風雨中身姿挺拔,操場上留下了他們堅定的足跡,操場上回蕩著他們響亮的口號。同學們,面對眼前鮮艷的五星紅旗,請鼓起你進取的勇氣,面對主席臺上領導欣賞的目光,請亮出你軍人的風采,把胸中激蕩的豪情放飛藍天,用腳下有力的足音叩響大地! 3.現(xiàn)在迎面而來的是人文學院的方陣,看,那矯健的步伐正象征著他們永不言棄的精神,那響亮的口號代表著他們奮發(fā)向上的動力,那嚴整的軍姿更彰顯這他們永爭第一的決心。整齊有力的步伐是他們前進的鼓點,堅定昂揚的精神是他們奮斗的源泉。他們將秉承“艱苦奮斗,自強不息”的精神,勇敢向前,追求卓越,編織美麗的夢想,渲染七彩的人生。 4.向著朝陽,邁著健步,迎面走來的是英姿颯爽的人文學子。他們并肩踏著青春的旋律,和著歡樂的樂曲,邁著矯健自信的步伐,整齊劃一,氣宇軒昂。那一陣陣擲地有聲的步伐,那一聲聲鏗鏘有力的口號,無不洋溢著人文學子勃勃的生機。他們風華正茂,雄姿英發(fā),他們樂觀自信、奮發(fā)向上。聽,嘹亮的聲音,昭示出他們的蓬勃朝氣,看,炯炯的目光,展示著他們的自信剛強。今天的成果來自昨天的汗水,向前吧,美好的明天從現(xiàn)在鑄造!第二篇:奇數(shù)階魔方陣算法分析
第三篇:方陣解說詞
第四篇:方陣解說詞
第五篇:方陣解說詞