【算法設計與分析】—— 魔方陣 (莫慌莫慌)

算法題目

在這裏插入圖片描述

算法分析

  • 最重要的是要知道想要實現輸入任意的奇數,輸出相應階數的魔方陣,我們應該要怎麼樣做,即找出怎麼樣的規律,使我們更加容易的實現編程,所以我們需要做充分的數學準備工作~
    在這裏插入圖片描述
  • 魔方陣和螺旋陣的輸出是一樣的,即在控制位數上,我們要找到最大位數(n*n),並求出相應的位數,在輸出時使用%*d格式輸出,控制輸出位數是相當重要的一步工作~

在這裏插入圖片描述
在這裏插入圖片描述

代碼實現

#include<stdio.h>
//magic square array
//6 1 8
//7 5 3
//2 9 4
int s[100][100];    //大數組放在外面哦~
int main()
{
    int n;      //表示奇數階魔方陣
    int k=1;    //魔方陣起始數據
    int i,j;    //i表示行下標 j表示列下標
    int i1,j1;  //臨時存儲變量i,j  若已被佔用 則重新賦值
    int m;      //m=n*n
    int count=0;//記錄m的位數 控制輸出位數

    printf("請輸入你想要輸出的奇數魔方陣階數(請輸入奇數):\n");
    scanf("%d",&n);

    m=n*n;

    while(m!=0) //求m的位數
    {
        count++;
        m=m/10;
    }

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            s[i][j]=0;         //標識變量 表明還沒有被佔用
        }
    }

    i=1;
    j=(n+1)/2;

    while(k<=n*n)
    {
        s[i][j]=k;
        k++;

        i1=i;
        j1=j;

        i=i-1;
        j=j-1;

        if(i==0) i=n;
        if(j==0) j=n;

        if(s[i][j]!=0)
        {
            i=i1+1;
            j=j1;
        }
    }


    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            printf("%*d ",count,s[i][j]);
        }
        printf("\n");
    }



    return 0;
}

結果示例

  • 示例一
    在這裏插入圖片描述
  • 示例二
    在這裏插入圖片描述
  • 示例三
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章