神奇的魔術方陣

魔術方陣簡單的說,就是將連續整數1,2,3....,n 的數字,依特別之順序,排在方陣裏.使每一行的數,每一列的數或對角線位置的數各自相加,所得的和皆均爲相同.

魔術方陣別稱魔術方陣,是一種已流傳千年的數字排列,不管是中西方對這奇妙的陣列都有所研究.


對平面魔方的構造,分爲三種情況:N爲奇數、N爲4的倍數、N爲其它偶數(4n+2的形式)  
N 爲奇數時,最簡單  
 (1) 將1放在第一行中間一列;  
 (2) 從2開始直到n×n止各數依次按下列規則存放:每一個數存放的行比前一個數的行數減1,列數加1 
 (3) 如果行列範圍超出矩陣範圍,則迴繞。   例如1在第1行,則2應放在最下一行,列數同樣加1;  
 (4) 如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,則把下一個數放在上一個數的下面。


用C語言實現的代碼:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100

int main()
{
	int n;   //矩陣行、列數
	int matrix[MAXSIZE][MAXSIZE]={0};
	int i=1,j;     //循環變量
	int k=1;
	int tmpi=0,tmpj=0;

	while(1)
	{
		printf("請輸入矩陣行數(奇數):");
	    scanf("%d",&n);
		if((n<=0)||(n%2==0))
		{
			printf("請輸入正確的矩陣行數(正奇數):");
		    scanf("%d",&n);
		}
		else
			break;
	}
    j=n/2+1;
	matrix[i][j]=k;
    for(k=2;k<=n*n;k++)
	{			
            tmpi=i;
			tmpj=j;
			if(j==n)
			{
				j=1;
			}
			else
			{
				j++;
			}
			if(i==1)
			{
				i=n;
			}
			else
			{
				i--;
			}	
			if(matrix[i][j]!=0)
			{	
				i=tmpi+1;
			    j=tmpj;	
			}
			matrix[i][j]=k;
        }
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			printf("%2d   ",matrix[i][j]);
		}
		printf("\n");
	}
}

運行效果如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章