2390: 【作】【普及-】【P2615】神奇的幻方
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:4
解决:4
题目描述
幻方是一种很神奇的 矩阵:它由数字 构成,且每行、每列及两条对角线上的数字之和都相同。
当 为奇数时,我们可以通过下方法构建一个幻方:
首先将 写在第一行的中间。
之后,按如下方式从小到大依次填写每个数 :
- 若 在第一行但不在最后一列,则将 填在最后一行, 所在列的右一列;
- 若 在最后一列但不在第一行,则将 填在第一列, 所在行的上一行;
- 若 在第一行最后一列,则将 填在 的正下方;
- 若 既不在第一行,也不在最后一列,如果 的右上方还未填数,则将 填在 的右上方,否则将 填在 的正下方。
现给定 ,请按上述方法构造 的幻方。
输入
一个正整数 ,即幻方的大小。
输出
共 行,每行 个整数,即按上述方法构造出的 的幻方,相邻两个整数之间用单空格隔开。
样例输入 复制
3
样例输出 复制
8 1 6
3 5 7
4 9 2
提示
对于的数据,对于全部数据, 且 为奇数。
NOIp2015 提高组 d1t1
#include<bits/stdc++.h>
using namespace std;
int n,g[40][40],x,y;
int main(){
cin>>n;
g[1][n/2+1]=1;
x=1;y=n/2+1;
for (int i=2;i<=n*n;i++) {
if (x==1&&y!=n) //第一行但不是最后一列
g[n][y+1]=i,x=n,y++;
else if (y==n&&x!=1) //最后一列但不是第一行
g[x-1][1]=i,x--,y=1;
else if (x==1&&y==n) //第一行最后一列
g[2][n]=i,x=2;
else if (x!=1&&y!=n) { //不在第一行,也不在最后一列
if (g[x-1][y+1]==0) //右上方未填数
g[x-1][y+1]=i,x--,y++;
else
g[x+1][y]=i,x++;
continue;
}
}
for (int i=1;i<=n;i++) {
for (int j=1;j<=n;j++)
cout<<g[i][j]<<" ";
cout<<endl;
}
return 0;
}