任意階魔方陣演算法的實現

2021-06-21 06:59:15 字數 1832 閱讀 4012

魔方陣,古代又稱「縱橫圖」,是指組成元素為自然數1、2…n的平方的n×n的方陣,其中每個元素值都不相等,且每行、每   列以及主、副對角線上各n個元素之和都相等。以下是**,演算法嵌入到注釋中:

/*

reference from

*/#include/*

輸出陣列

*/int printa(int **magic,int n)

printf("輸出結果:\n");

for(i=1;i<=n;i++)

return 1;}/*

奇階陣求法

奇數階幻方最經典的填法是羅伯法。填寫的方法是:

把1(或最小的數)放在第一行正中; 按以下規律排列剩下的(n×n-1)個數:

1、每乙個數放在前乙個數的右上一格;

2、如果這個數所要放的格已經超出了頂行那麼就把它放在底行,仍然要放在右一列;

3、如果這個數所要放的格已經超出了最右列那麼就把它放在最左列,仍然要放在上一行;

4、如果這個數所要放的格已經超出了頂行且超出了最右列,那麼就把它放在前乙個數的下一

行同一列的格內;

5、如果這個數所要放的格已經有數填入,那麼就把它放在前乙個數的下一行同一列的格內。

*/void odd(int n)

else

//write

int fullfill(int **magic,int n,int next);

fullfill(magic, n ,1);

}//else

printa(magic,n);

}//endof cardinal

/*int fullfill()階梯法填陣列

****/

int fullfill(int **magic,int n,int next)

}//for for end

}//else end

printa(magic,n);

}/*單階偶陣void singleeven()

(1)把方陣分為a,b,c,d四個象限,這樣每乙個象限肯定是奇數階。用羅伯法,依次在a

象限,d象限,b象限,c象限按奇數階幻方的填法填數。

(2)在a象限的中間行、中間格開始,按自左向右的方向,標出k格。a象限的其它行則標出

最左邊的k格。將這些格,和c象限相對位置上的數,互換位置。

(3)在b象限任一行的中間格,自右向左,標出k-1列。(注:6階幻方由於k-1=0,所以不用

再作b、d象限的資料交換),

將b象限標出的這些數,和d象限相對位置上的數進行交換,就形成幻方。

*/void singleeven(int n)

}if(n%4!=0&&n%2==0)

//從每一行的中間格開始向右標記m-1列,並交換b d對應位置

if(i<=m-1)

for(j=1;j<=k;j++)

}/*

printa(a,k);

printa(b,k);

printa(c,k);

printa(d,k);

*///@輸出結果----------------------

printf("輸出結果:\n");

for(i=1;i<=k;i++)

for(i=1;i<=k;i++)

//end output---------------------

}else

printf("wrong method use!!\n");

}//--->>>>>程式入口<<<<<----

int main()

return 0;

}

魔方陣1 奇階魔方陣

魔方陣 古代又稱 縱橫圖 是指組成元素為自然數1 2 n2的平方的n n的方陣,其中每個元素值都不相等,且每行 每列以及主 副對角線上各n個元素之和都相等。魔方陣分為奇階魔方陣和偶階魔方陣,偶階魔方陣又分為能被四整除和不能被四整除兩種,今天來給大家講解奇階魔方陣,後續會為大家補充剩餘的魔方陣。奇階魔...

N階魔方陣

寫出程式填寫出n n 魔方陣 的數值。所謂魔方陣是指這樣的方陣,資料是正整數,從1開始,每個遞增1,每個資料不重複出現,它的每一行 每一列和對角線之和均相等 n是奇數 input 3 5 output 8 1 6 3 5 7 4 9 2 17 24 01 08 15 23 05 07 14 16 0...

n階魔方陣

魔方陣 計算規律 1.將1放在第一行中間一列 2.從2開始到nn按如下規律 每乙個數存放的行數比上乙個數的行數減1 每乙個數存放的列數比上乙個數的列數加1 3.當乙個數的行數為1,他的下乙個數行數為n 4.當乙個數的列數為n,他的下乙個數的列數為1,行數減1 5.若按上述規則確定的位置有數字或上乙個...