C語言復習---輸出魔方陣


一:奇魔方陣

算法:

1.第一個元素放在第一行中間一列
2.下一個元素存放在當前元素的上一行、下一列。
3.如果上一行、下一列已經有內容,則下一個元素的存放位置為當前列的下一行。
在找上一行、下一行或者下一列的時候,必須把這個矩陣看成是回繞的。

算法實現:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXSIZE 100

int main()
{
    //輸出魔方陣
    int n,i,j;
    int row, col;
    int lrow, lcol;    //保存上一步數據,用於還原
    int a[MAXSIZE][MAXSIZE] = { 0 };

    while (1)
    {
        printf("print a odd number:(3-99)");
        scanf("%d", &n);
        if (n % 2)
            break;
    }
    
    row = 0; col = (n - 1) / 2;  
    a[row][col] = 1;

    for (i = 2; i <= n*n; i++)
    {
        row--;
        col++;
        if (row < 0)
            row = n - 1;
        if (col >= n)
            col = 0;
        if (a[row][col])    //若是上一行下一列處有數據了,我們就要將下標還原,行數加一
        {
            row = lrow + 1;
            col = lcol;
            if (row >= n)
                row = 0;
        }
        
        lcol = col;
        lrow = row;
        a[row][col] = i;
    }

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%5d", a[i][j]);
        printf("\n");
    }

    system("pause");
    return 0;
}

二:階數n = 4 * m(m =1,2,3……)的偶魔方的規律如下:

按數字從小到大,即1,23……n2順序對魔方陣從左到右,從上到下進行填充;
將魔方陣分成若干個4×4子方陣,將子方陣對角線上的元素取出;
將取出的元素按從大到小的順序依次填充到n×n方陣的空缺處。

算法實現:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXSIZE 100

int main()
{
    //輸出魔方陣
    int n,i,j;
    int row, col;
    int a[MAXSIZE][MAXSIZE] = { 0 };
    int tempArray[MAXSIZE*MAXSIZE / 2] = { 0 };    //用於存放各個子方陣的主對角線

    while (1)
    {
        printf("print a even number:(4-100)");
        scanf("%d", &n);
        if (n % 4==0)
            break;
    }
    
    //步驟一:將數據按順序填充
    i = 1;
    for (row = 0; row < n; row++)
        for (col = 0; col < n; col++)
            a[row][col] = i++;

    //步驟二:將數據全部分為4X4子方陣,取出其中的主對角線,按照大小排序。注意:這里獲取的數據已經是從小到大了
    i = 0;
    for (row = 0; row < n; row++)
    {
        for (col = 0; col < n; col++)
        {
            if ((col % 4 == row % 4) || ((col % 4 + row % 4) == 3))
            {
                tempArray[i] = a[row][col];
                i++;
            }
        }
    }

    //步驟三:將數據從大到小放入之前的子方陣對角線上
    i--;
    for (row = 0; row < n; row++)
    {
        for (col = 0; col < n; col++)
        {
            if ((col % 4 == row % 4) || ((col % 4 + row % 4) == 3))
            {
                a[row][col] = tempArray[i];
                i--;
            }
        }
    }

    //步驟四:輸出魔方陣
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%5d", a[i][j]);
        printf("\n");
    }

    system("pause");
    return 0;
}

三:階數n = 4 * m + 2(m =1,2,3……)的魔方(單偶魔方)

將魔方分成A、B、C、D四個k階方陣,這四個方陣都為奇方陣,利用上面講到的方法依次將A、D、B、C填充為奇魔方。
交換A、C魔方元素,對魔方的中間行,交換從中間列向右的m列各對應元素;對其他行,交換從左向右m列各對應元素。
交換B、D魔方元素,交換從中間列向左m – 1列各對應元素。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXSIZE 6

int main()
{
    //輸出魔方陣
    int n, i, j, k,temp;
    int row, col;
    int lrow, lcol;
    int a[MAXSIZE][MAXSIZE] = { 0 };
    
    while (1)
    {
        printf("print a even number:4*m+2<m=1,2,...>");
        scanf("%d", &n);
        if (n % 4 == 2)
            break;
    }

    //步驟一:構建四個子方陣ADBC
    //先構建A,然后對A進行每個元素加即可得到所有的子方陣
    k = n / 2;
    row = 0;
    col = (k - 1) / 2;
    a[row][col] = 1;
    for (i = 2; i <= k*k;i++)
    {
        row--;
        col++;
        if (row < 0)
            row = k - 1;
        if (col >= k)
            col = 0;
        if (a[row][col])
        {
            row = lrow + 1;
            col = lcol;
            if (row >= k)
                row = 0;
        }

        lcol = col;
        lrow = row;
        a[row][col] = i;
    }

    //按照順序構建DBC方陣
    for (row = 0; row < k;row++)
    {
        for (col = 0; col < k;col++)
        {
            a[row + k][col + k] = a[row][col] + k*k;    //D子方陣
            a[row][col + k] = a[row][col] + 2*k*k;    //B子方陣
            a[row + k][col] = a[row][col] + 3*k*k;    //C子方陣
        }
    }
    
    //步驟二:交換AC子方陣的數據
    //1.先交換中間行的右半部分的m列,N=2*(2*m+1),k=2*m+1,m=(k-1)/2,所以這里的m是不包含最后一列的,包含中間列
    //2.對於其他行,將會每行的前半部分
    for (row = 0; row < k;row++)
    {
        if (row == k / 2)    //中間行
        {
            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列,不包含中間列
        {
            for (col = 0; col < k / 2;col++)
            {
                temp = a[row][col];
                a[row][col] = a[row + k][col];
                a[row + k][col] = temp;
            }
        }
    }

    //步驟三:交換BD子方陣,交換中間列向左m-1列
    for (row = 0; row < k;row++)
    {
        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 (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
            printf("%5d", a[i][j]);
        printf("\n");
    }

    system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM