n-魔方陣(找規律)

所謂“n-魔方陣”,指的是使用1〜n2共n2個自然數排列成一個n×n的方陣。該方陣的每行、每列及對角線元素之和都相等,併爲一個只與n有關的常數,該常數爲n×(n2+1)/2。 本題要求實現n-魔方陣(階數最大爲20)n的值從鍵盤讀入,題目保證n的值爲奇數。

輸入格式:

輸入在一行中給出一個奇數n的值。

輸出格式:

按照樣例的格式輸出對應的n-魔方陣,每列佔5個字符,右對齊。

輸入樣例:

5

輸出樣例:

生成的5-魔方陣爲:
   17   24    1    8   15
   23    5    7   14   16
    4    6   13   20   22
   10   12   19   21    3
   11   18   25    2    9

規律如下: 

1.數字1位於第一行的正中間
2.下一個數放到上一個數的右上角(即上一行下一列),若無上一行則放到最後一行,若無下一列則放到第一列
3.若新位置已經放了數,則將其放入上一個數的正下方(即下一行的同一列)
#include<iostream>
using namespace std;
int main()
{
	int n,a[23][23]={0};
	cin>>n;
	int n2 = n*n,l = 0,cha = (n2-1)/(n-1);
	int begin = 1,zNum,v = 2;
	int x = 1,y=n/2+1,newX,newY;
	a[1][n/2+1] = 1;
	while(v <= n2){
		newX = x - 1,newY = y + 1;
		if(newX <= 0) newX = n;
		if(newY > n) newY = 1; 
		if(a[newX][newY] == 0) {
			a[newX][newY] = v;
			x = newX, y = newY;
		}else {
			a[x+1][y] = v;
			x = x+1;
		}
		v ++;
	}
	printf("生成的%d-魔方陣爲:\n",n);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%5d",a[i][j]);
		}
		putchar('\n');
	}
	return 0;
}

 

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