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

n階魔方陣(奇數陣)的輸出

編輯:關於C語言

需求  

  要求輸出1~n²的自然數構成的魔方陣。

STEP 1 什麼是魔方陣?

  魔方陣,古代又稱“縱橫圖”,是指組成元素為自然數1、2…n2的平方的n×n的方陣,其中每個元素值都不相等,且每行、每列以及主、副對角線上各n個元素之和都相等。

STEP 2 魔方陣的規律是什麼?

  此處先寫簡單一點的奇階魔方陣,偶數階的算法更復雜,暫不討論。

  奇階魔方陣的排列方法:

  ⑴將1放在第一行中間一列;

  ⑵從2開始直到n×n止各數依次按下列規則存放;每一個數存放的行比前一個數的行數減1,列數加1;

  ⑶如果上一個數的行數為1,則下一個數的行數為n(指最下一行);

  ⑷當上一個數的列數為n時,下一個數的列數應為1,行數減去1;

  ⑸如果按上面規則確定的位置上已有數,或上一個數是第一行第n列時,則把下一個數放在上一個數的下面。

STEP 3 編程思路

  ⑴構造一個n階魔方陣雛形,即n*n的動態二維數組;

  ⑵編寫函數實現魔方陣的排列算法;

  ⑶調用函數輸出魔方陣。

STEP 4 要點整理

  malloc函數:分配內存空間給動態數組(使用後需在函數最後用free語句釋放所占用的內存)

  memset函數:給數組的所有元素賦初值

 

-----------------------------------------華麗麗的分割線---------------------------------代碼君要出場了-----------------------------------

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 void f(int x);
 6 
 7 int main()
 8 {
 9     int x;
10 
11     scanf("%d", &x);
12     f(x);
13 
14     return 0;
15 }
16 
17 void f(int x)
18 {
19     int i, m, n;
20     int **mf;
21     
22     mf = (int **)malloc(sizeof(int *) * x);              //定義動態二維數組mf
23 
24     for(i = 0; i < x; i++)
25     {
26         mf[i] = (int *)malloc(sizeof(int) * x);
27         memset(mf[i], 0, sizeof(int) * x);                   //初始化,將二維數組mf所有元素賦值為0
28     }
29 
30     m = 0;
31     n = x / 2;
32     mf[m][n] = 1;
33 
34     for(i = 2; i <= x * x; i++)
35     {
36         m--;
37         n++;
38 
39         if(m < 0)       //如果是在第一行,行數變為最後一行,列數加1 
40         {
41             m = x - 1;
42         }
43     
44         if(n > x - 1)    //如果是在最後一列,行數減1,列數為第1行
45         {
46             n = 0;
47         }
48             
49         if(mf[m][n] != 0)               //如果後續的數所處位置已有數,則行數加1,列數不變
50             m++;
51 
52         mf[m][n] = i;
53     }
54 
55     for(m = 0; m < x; m++)
56     {
57         for(n = 0; n < x; n++)
58         {
59             printf("%5d", mf[m][n]);
60         }
61 
62         printf("\n");    
63     }
64 
65     for(i = 0; i < x; i++)         //釋放占用的內存
66     {
67         free(mf[i]);
68         mf[i] = 0;
69     }
70 
71     free(mf);      
72     mf = 0;
73 }



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