陣列5——二維陣列3——列印魔方陣
阿新 • • 發佈:2018-12-22
3階的魔方陣在四千年前中國科學家就知道了,河圖正是一個3階魔方陣的例子。列印魔方陣。魔方陣,又稱“縱橫圖”,是指組成元素為自然數1,2,... ,n^2的n×n的方陣,其中每個元素值都不相等,且每行,每列及主、副對角線上元素之和都相等。
例如,3×3的魔方陣如圖
【分析】
構造魔方陣的方法如下:
(1)將1放在第一行中間一列;
(2)從2開始直到n×n為止各數依次按照下列規則存放:每一個數存放的行比前一個的行數減1,列數加1。例如6在5的上一行後一列;
(3)如果上一個數的行數為1,則下一個數的行數為n。例如8在第1行,9在最後一行,列數加1;
(4)當上一個數的列數為n時,下一個數的列數應為1,行數減去1。例如,2在最後一列,3在第一列,行數減1;
(5)如果按照上面規則確定的位置上已有數,或者上一個數是第1行第n列時,則把下一個數放在上一個數的下面。例如,按照上面規定,4應該放在第1行第2列,但該位置已經被佔據,所以4就在3的下面。
main.cpp
#include<stdio.h> #define N 20 #include <iostream> using namespace std; void main() { int a[N][N], n, i, j, k; /*輸入矩陣的階*/ while (1) { printf("請輸入一個正整數n(n≤20,n是奇數):"); scanf("%d", &n); if (n != 0 && n <= 20 && n % 2 != 0) { printf("%d階魔方矩陣.\n", n); break; } } /*初始化二維陣列*/ for (i = 0; i < n; i++) for (j = 0; j < n; j++) a[i][j] = 0; /*構造魔方陣*/ i = 0; j = n / 2; a[i][j] = 1; /*1放在第1行中間一列*/ k = 2; while (k <= n*n) { i = i - 1; /*行號減1*/ j = j + 1; /*列號增1*/ /*如果上一個數位於第1行第n列,當前的數應在上一個數的下面*/ if (i<0 && j>n - 1) { i = i + 2; j = j - 1; } else { /*如果上一個數位於第1行,則當前的數應位於最後一行*/ if (i < 0) i = n - 1; /*如果上一個數位於第n列,則將當前的數應位於第1列*/ if (j > n - 1) j = 0; } if (a[i][j] == 0) /*當前的數儲存到陣列中*/ a[i][j] = k; else /*如果已經有數存在,則放在上一個數的下面*/ { i = i + 2; j = j - 1; a[i][j] = k; } k++; /*k增加1,準備存放下一個數*/ } /*輸出魔方陣*/ for (i = 0; i < n; i++) { for (j = 0; j < n; j++) printf("%4d", a[i][j]); printf("\n"); } system("pause"); }
結果: