程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話完成魔方陣算法(幻方陣 奇魔方 單偶魔方完成)

C說話完成魔方陣算法(幻方陣 奇魔方 單偶魔方完成)

編輯:關於C++

C說話完成魔方陣算法(幻方陣 奇魔方 單偶魔方完成)。本站提示廣大學習愛好者:(C說話完成魔方陣算法(幻方陣 奇魔方 單偶魔方完成))文章只能為提供參考,不一定能成為您想要的結果。以下是C說話完成魔方陣算法(幻方陣 奇魔方 單偶魔方完成)正文


例如三階魔方陣為:

魔方陣有甚麼的紀律呢?

魔方陣分為奇異方和偶幻方。而偶幻方又分為是4的倍數(如4,8,12……)和不是4的倍數(如6,10,14……)兩種。上面分離停止引見。

2 奇魔方的算法

2.1 奇魔方的紀律與算法

奇魔方(階數n = 2 * m + 1,m =1,2,3……)紀律以下:

數字1位於方陣中的第一行中央一列;
數字a(1 < a  ≤ n2)地點行數比a-1行數少1,若a-1的行數為1,則a的行數為n;
數字a(1 < a  ≤ n2)地點列數比a-1列數年夜1,若a-1的列數為n,則a的列數為1;
假如a-1是n的倍數,則a(1 < a  ≤ n2)的行數比a-1行數年夜1,列數與a-1雷同。

2.2 奇魔方算法的C說話完成


#include <stdio.h>
// Author: http://furzoom.com/
// N為魔方階數
#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:階數n = 4 * m(m =1,2,3……)的偶魔方的紀律以下:

按數字從小到年夜,即1,2,3……n2次序對魔方陣從左到右,從上到下停止填充;
將魔方陣分紅若干個4×4子方陣,將子方陣對角線上的元素掏出;
將掏出的元素按從年夜到小的次序順次填充到n×n方陣的空白處。

C說話完成


#include <stdio.h>
// Author: http://furzoom.com/
// N為魔方階數
#define N 12

int main()
{
    int a[N][N];//存儲魔方
    int temparray[N*N/2];//存儲掏出的元素
    int i;//輪回變量
    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 階數n = 4 * m + 2(m =1,2,3……)的魔方(單偶魔方)

算法

設k = 2 * m + 1;單偶魔方是魔方中比擬龐雜的一個。

將魔方分紅A、B、C、D四個k階方陣,以下圖這四個方陣都為奇方陣,應用下面講到的辦法順次將A、D、B、C填充為奇魔方。
交流A、C魔方元素,對魔方的中央行,交流從中央列向右的m列各對應元素;對其他行,交流從左向右m列各對應元素。
交流B、D魔方元素,交流


#include <stdio.h>
// Author: http://furzoom.com/
// N為魔方階數
#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 )//前一個數是3的倍數
        {
            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;
    }

    //依據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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved