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