最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實現(xiàn)魔方陣算法(幻方陣 奇魔方 單偶魔方實現(xiàn))

 更新時間:2013年11月26日 09:59:33   投稿:zxhpj  
魔方陣是指由1,2,3……n2填充的,每一行、每一列、對角線之和均相等的方陣,階數(shù)n = 3,4,5…。魔方陣也稱為幻方陣,看下面的實現(xiàn)方法吧

例如三階魔方陣為:

魔方陣有什么的規(guī)律呢?

魔方陣分為奇幻方和偶幻方。而偶幻方又分為是4的倍數(shù)(如4,8,12……)和不是4的倍數(shù)(如6,10,14……)兩種。下面分別進行介紹。

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語言實現(xiàn)

復(fù)制代碼 代碼如下:

#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ū)δХ疥噺淖蟮接?,從上到下進行填充;
將魔方陣分成若干個4×4子方陣,將子方陣對角線上的元素取出;
將取出的元素按從大到小的順序依次填充到n×n方陣的空缺處。

C語言實現(xiàn)

復(fù)制代碼 代碼如下:

#include <stdio.h>
// Author: http://furzoom.com/
// N為魔方階數(shù)
#define N 12
 
int main()
{
    int a[N][N];//存儲魔方
    int temparray[N*N/2];//存儲取出的元素
    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++;
            }
        }
    //取出子方陣中對角線上的元素,且恰好按從小到大的順序排放
    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ù)雜的一個。

將魔方分成A、B、C、D四個k階方陣,如下圖這四個方陣都為奇方陣,利用上面講到的方法依次將A、D、B、C填充為奇魔方。
交換A、C魔方元素,對魔方的中間行,交換從中間列向右的m列各對應(yīng)元素;對其他行,交換從左向右m列各對應(yīng)元素。
交換B、D魔方元素,交換

復(fù)制代碼 代碼如下:

#include <stdio.h>
// Author: http://furzoom.com/
// N為魔方階數(shù)
#define N 10
 
int main()
{
    int a[N][N] = { {0} };//存儲魔方
    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 )//前一個數(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;
}

相關(guān)文章

  • C++實現(xiàn)雙向鏈表(List)

    C++實現(xiàn)雙向鏈表(List)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 學(xué)習(xí)二維動態(tài)數(shù)組指針做矩陣運算的方法

    學(xué)習(xí)二維動態(tài)數(shù)組指針做矩陣運算的方法

    這片文章介紹了如何利用二維動態(tài)數(shù)組指針做矩陣運算,需要的朋友可以參考下
    2015-07-07
  • C++運算符重載的詳細講解

    C++運算符重載的詳細講解

    這篇文章主要給大家介紹了關(guān)于C++運算符重載的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 解決C++全局變量只能初始化不能賦值的問題

    解決C++全局變量只能初始化不能賦值的問題

    今天小編就為大家分享一篇解決C++全局變量只能初始化不能賦值的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C語言實現(xiàn)成績統(tǒng)計示例

    C語言實現(xiàn)成績統(tǒng)計示例

    這篇文章主要介紹了C語言實現(xiàn)成績統(tǒng)計示例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實現(xiàn)十六進制字符串轉(zhuǎn)換為十進制整數(shù)的方法

    C++實現(xiàn)十六進制字符串轉(zhuǎn)換為十進制整數(shù)的方法

    這篇文章主要介紹了C++實現(xiàn)十六進制字符串轉(zhuǎn)換為十進制整數(shù)的方法,涉及C++字符串與數(shù)制轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C++實現(xiàn)比特幣系統(tǒng)的源碼

    C++實現(xiàn)比特幣系統(tǒng)的源碼

    這篇文章主要介紹了C++實現(xiàn)比特幣系統(tǒng)的源碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 用c語言實現(xiàn)2000內(nèi)既能被3整除又能被7整除的個數(shù)

    用c語言實現(xiàn)2000內(nèi)既能被3整除又能被7整除的個數(shù)

    本篇文章是對使用c語言實現(xiàn)2000內(nèi)既能被3整除又能被7整除的個數(shù),用實例進行了分析說明,需要的朋友參考下
    2013-05-05
  • C++超詳細講解泛型

    C++超詳細講解泛型

    泛型編程,故如其名,是一個泛化的編程方式。其實現(xiàn)原理為程序員編寫一個函數(shù)/類的代碼示例,讓編譯器去填補出不同的函數(shù)實現(xiàn)
    2022-07-07
  • C++ 手把手教你實現(xiàn)可變長的數(shù)組實現(xiàn)

    C++ 手把手教你實現(xiàn)可變長的數(shù)組實現(xiàn)

    這篇文章主要介紹了C++ 手把手教你實現(xiàn)可變長的數(shù)組實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論

苗栗县| 襄垣县| 汉寿县| 文成县| 宣汉县| 鱼台县| 汶川县| 沿河| 大新县| 自治县| 铅山县| 井陉县| 昌乐县| 斗六市| 乐业县| 咸宁市| 和田市| 沙雅县| 临泽县| 盘锦市| 商都县| 沛县| 大冶市| 平谷区| 乌鲁木齐市| 合作市| 方正县| 彝良县| 象州县| 盐津县| 徐汇区| 平利县| 什邡市| 孙吴县| 江北区| 牙克石市| 青龙| 双峰县| 齐齐哈尔市| 河西区| 扬州市|