总时间限制:
1000ms
内存限制:
65535kB
描述
幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
输入
一个数字N(N<=20)
输出
按上方法构造的2N-1 * 2N-1的幻方
样例输入
3
样例输出
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
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,a[50][50],x,y;
int main()
{
cin>>n;
m=2*n-1;
a[1][n]=1;
x=1;y=n;
for(int i=2;i<=m*m;i++)
{
if(x==1&&y==m||a[x-1][y+1]!=0)
{
x++;
}else if(x==1)
{
x=m;y++;
}else if(y==m)
{
y=1;x--;
}else {
x--;y++;
}
a[x][y]=i;
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=m;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}