題目:
輸出魔方陣,所謂魔方陣是指這樣的方陣,它的每一行,每一列和對角線的和均相等,要輸出1-n^2個自然數構成的魔方陣,例如
8 1 6
3 5 7
4 9 2
解決方案
當n<=2時不存在魔方矩陣
if
(n<3)
當n為奇數時,可用「羅泊法」即
⑴將1放在第一行中間一列;⑵從2開始直到n×n止各數依次按下列規則存放;每乙個數存放的行比前乙個數的行數減1,列數加1(例如上面的三階魔方陣,5在4的上一行後一列);
⑶如果上乙個數的行數為1,則下乙個數的行數為n(指最下一行);例如1在第一行,則2應放在最下一行,列數同樣加1;
⑷當上乙個數的列數為n時,下乙個數的列數應為1,行數減去1。例如2在第3行最後一列,則3應放在第二行第一列;
⑸如果按上面規則確定的位置上已有數,或上乙個數是第一行第n列時,則把下乙個數放在上乙個數的下面。例如按上面的規定,4應該放在第1行第2列,但該位置已經被佔據,所以4就放在3的下面。
if
(n%2==1
) a[i]
[j]=count++;}
}
3.當n為偶數時,又分為兩種情況,即n能否被4整除
當n能被4整除時,方案如下
(1) 先將整個方陣劃分成k*k個4階方陣,然後在每個4階方陣的對角線上做記號;(2) 由左而右、由上而下,遇到沒有記號的位置才填數字,但不管是否填入數字,每移動一格數字都要加1;
(3) 自右下角開始,由右而左、由下而上,遇到沒有數字的位置就填入數字,但每移動一格數字都要加1。
if
(n%4==0
)int count=1;
for(
int i=
0;i)for
(int j=
0;j(a[i]
[j]==0)
a[i]
[j]=count++
;for
(int i=n-
1;i>=
0;i--
)for
(int j=n-
1;j>=
0;j--)if
(a[i]
[j]==-1
) a[i]
[j]=count++
;}
當n不能被4整除時,方案如下
填製魔方陣時,先將整個方陣劃成田字型的四個2 k + 1階的奇數階小方陣,並以下法做註記:(1)右半兩個小方陣中大於k+2的列;
(2)左半兩個小方陣中( k + 1 , k + 1 )的格位;
(3)左半兩個小方陣中除了( k+1 , 1 )是指第一列第k+1行的格位之外,小於k +1的列。
以奇數階魔方陣的方法連續填製法依左上、右下、右上、左下的順序分別填製這四個小方陣。將上半及下半方陣中有註記的數字對調,魔方陣完成。
if
(n%4==2
) a[i+x]
[j+y]
=count++;}
switch
(sym)
}int k=
(n-2)/
4;for(
int j=num+k+
2;jint temp=a[k]
[k]; a[k]
[k]=a[k+num]
[k]; a[k+num]
[k]=temp;
//2for
(int j=
0;j)for
(int i=
0;i(i!=k)
}
執行結果如下n=10
完整**示例
void
function4
(int n)
if(n%2==
1)a[i]
[j]=count++;}
}if(n%4==0
)int count=1;
for(
int i=
0;i)for
(int j=
0;j(a[i]
[j]==0)
a[i]
[j]=count++
;for
(int i=n-
1;i>=
0;i--
)for
(int j=n-
1;j>=
0;j--)if
(a[i]
[j]==-1
) a[i]
[j]=count++;}
if(n%4==
2)a[i+x]
[j+y]
=count++;}
switch
(sym)
}int k=
(n-2)/
4;for(
int j=num+k+
2;jint temp=a[k]
[k]; a[k]
[k]=a[k+num]
[k]; a[k+num]
[k]=temp;
//2for
(int j=
0;j)for
(int i=
0;i(i!=k)
}for
(int i=
0;i)}
C語言 輸出「魔方陣」
本程式要輸出魔方陣,魔方陣如下 1 8 1 6 2 17 24 1 8 15 3 5 7 23 5 7 14 16 4 9 2 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 了解題可知 1.第一行中間一列的值為1。所以用j n 2 1確定1的列數,得出a 1 j 1...
C語言實現矩陣相乘
介紹了c語言實現矩陣相乘的常見演算法,並考慮優化程式,提高效能介紹了改進的演算法。1.矩陣相乘 矩陣相乘應滿足的條件 1 矩陣a的列數必須等於矩陣b的行數,矩陣a與矩陣b才能相乘 2 矩陣c的行數等於矩陣a的行數,矩陣c的列數等於矩陣b的列數 3 矩陣c中第i行第j列的元素等於矩陣a的第i行元素與矩...
C語言實現矩陣相乘
分析 首先我們可以根據題意寫出函式頭。可以定為void matrixmutiply int m,int n,int p,long lmatrix1 max max long lmatrix2 max max long lmatrixresult max max 其中lmatrix1和lmatrix2...