1. 程式人生 > >陣列5——二維陣列3——列印魔方陣

陣列5——二維陣列3——列印魔方陣

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");
}

結果: