C語(yǔ)言實(shí)現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實(shí)現(xiàn))
例如三階魔方陣為:
魔方陣有什么的規(guī)律呢?
魔方陣分為奇幻方和偶幻方。而偶幻方又分為是4的倍數(shù)(如4,8,12……)和不是4的倍數(shù)(如6,10,14……)兩種。下面分別進(jìn)行介紹。
2 奇魔方的算法
2.1 奇魔方的規(guī)律與算法
奇魔方(階數(shù)n = 2 * m + 1,m =1,2,3……)規(guī)律如下:
數(shù)字1位于方陣中的第一行中間一列;
數(shù)字a(1 < a ≤ n2)所在行數(shù)比a-1行數(shù)少1,若a-1的行數(shù)為1,則a的行數(shù)為n;
數(shù)字a(1 < a ≤ n2)所在列數(shù)比a-1列數(shù)大1,若a-1的列數(shù)為n,則a的列數(shù)為1;
如果a-1是n的倍數(shù),則a(1 < a ≤ n2)的行數(shù)比a-1行數(shù)大1,列數(shù)與a-1相同。
2.2 奇魔方算法的C語(yǔ)言實(shí)現(xiàn)
#include <stdio.h>
// Author: http://furzoom.com/
// N為魔方階數(shù)
#define N 11
int main()
{
int a[N][N];
int i;
int col,row;
col = (N-1)/2;
row = 0;
a[row][col] = 1;
for(i = 2; i <= N*N; i++)
{
if((i-1)%N == 0 )
{
row++;
}
else
{
// if row = 0, then row = N-1, or row = row - 1
row--;
row = (row+N)%N;
// if col = N, then col = 0, or col = col + 1
col ++;
col %= N;
}
a[row][col] = i;
}
for(row = 0;row<N;row++)
{
for(col = 0;col < N; col ++)
{
printf("%6d",a[row][col]);
}
printf("\n");
}
return 0;
}
算法2:階數(shù)n = 4 * m(m =1,2,3……)的偶魔方的規(guī)律如下:
按數(shù)字從小到大,即1,2,3……n2順序?qū)δХ疥噺淖蟮接?,從上到下進(jìn)行填充;
將魔方陣分成若干個(gè)4×4子方陣,將子方陣對(duì)角線上的元素取出;
將取出的元素按從大到小的順序依次填充到n×n方陣的空缺處。
C語(yǔ)言實(shí)現(xiàn)
#include <stdio.h>
// Author: http://furzoom.com/
// N為魔方階數(shù)
#define N 12
int main()
{
int a[N][N];//存儲(chǔ)魔方
int temparray[N*N/2];//存儲(chǔ)取出的元素
int i;//循環(huán)變量
int col, row;// col 列,row 行
//初始化
i = 1;
for(row = 0;row < N; row++)
{
for(col = 0;col < N; col ++)
{
a[row][col] = i;
i++;
}
}
//取出子方陣中對(duì)角線上的元素,且恰好按從小到大的順序排放
i = 0;
for(row = 0;row < N; row++)
{
for(col = 0;col < N; col ++)
{
if((col % 4 == row % 4) || ( 3 == ( col % 4 + row % 4)))
{
temparray[i] = a[row][col];
i++;
}
}
}
//將取出的元素按照從大到小的順序填充到n×n方陣中
i = N*N/2 -1;
for(row = 0;row < N; row++)
{
for(col = 0;col < N; col ++)
{
if((col % 4 == row % 4) || ( 3 == ( col % 4 + row % 4)))
{
a[row][col] = temparray[i];
i--;
}
}
}
//輸出方陣
for(row = 0;row < N; row++)
{
for(col = 0;col < N; col ++)
{
printf("%5d",a[row][col]);
}
printf("\n");
}
return 0;
}
3.2 階數(shù)n = 4 * m + 2(m =1,2,3……)的魔方(單偶魔方)
算法
設(shè)k = 2 * m + 1;單偶魔方是魔方中比較復(fù)雜的一個(gè)。
將魔方分成A、B、C、D四個(gè)k階方陣,如下圖這四個(gè)方陣都為奇方陣,利用上面講到的方法依次將A、D、B、C填充為奇魔方。
交換A、C魔方元素,對(duì)魔方的中間行,交換從中間列向右的m列各對(duì)應(yīng)元素;對(duì)其他行,交換從左向右m列各對(duì)應(yīng)元素。
交換B、D魔方元素,交換
#include <stdio.h>
// Author: http://furzoom.com/
// N為魔方階數(shù)
#define N 10
int main()
{
int a[N][N] = { {0} };//存儲(chǔ)魔方
int i,k,temp;
int col,row;// col 列,row 行
//初始化
k = N / 2;
col = (k-1)/2;
row = 0;
a[row][col] = 1;
//生成奇魔方A
for(i = 2; i <= k*k; i++)
{
if((i-1)%k == 0 )//前一個(gè)數(shù)是3的倍數(shù)
{
row++;
}
else
{
// if row = 0, then row = N-1, or row = row - 1
row--;
row = (row+k)%k;
// if col = N, then col = 0, or col = col + 1
col ++;
col %= k;
}
a[row][col] = i;
}
//根據(jù)A生成B、C、D魔方
for(row = 0;row < k; row++)
{
for(col = 0;col < k; col ++)
{
a[row+k][col+k] = a[row][col] + k*k;
a[row][col+k] = a[row][col] + 2*k*k;
a[row+k][col] = a[row][col] + 3*k*k;
}
}
// Swap A and C
for(row = 0;row < k;row++)
{
if(row == k / 2)//中間行,交換從中間列向右的m列,N = 2*(2m+1)
{
for(col = k / 2; col < k - 1; col++)
{
temp = a[row][col];
a[row][col] = a[row + k][col];
a[row + k][col] = temp;
}
}
else//其他行,交換從左向右m列,N = 2*(2m+1)
{
for(col = 0;col < k / 2;col++)
{
temp = a[row][col];
a[row][col] = a[row + k][col];
a[row + k][col] = temp;
}
}
}
// Swap B and D
for(row = 0; row < k;row++)//交換中間列向左m-1列,N = 2*(2m+1)
{
for(i = 0;i < (k - 1)/2 - 1;i++)
{
temp = a[row][k+ k/2 - i];
a[row][k+ k /2 -i] = a[row + k][k+k/2 -i];
a[row + k][k+k/2 -i] = temp;
}
}
//輸出魔方陣
for(row = 0;row < N; row++)
{
for(col = 0;col < N; col ++)
{
printf("%5d",a[row][col]);
}
printf("\n");
}
return 0;
}
欄 目:C語(yǔ)言
本文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實(shí)現(xiàn))
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3896.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改