所謂“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;
}