1053: 奇数幻方
题目描述
幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。幻方也是一种汉族传统游戏。
在《射雕英雄传》中郭黄二人被裘千仞追到黑龙潭,躲进瑛姑的小屋。瑛姑出了一道题:数字1~9填到三行三列的表格中,要求每行、每列、及两条对角线上的和都相等。这道题难倒了瑛姑十几年,被黄蓉一下子就答出来了。这就是一个最简单的3阶平面幻方。因为幻方的智力性和趣味性,很多游戏和玩具都与幻方有关,如捉放曹操、我们平时玩的六面体,也成为学习编程时的常见问题。
对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式),其中N 为奇数时,所构造的幻方即为奇数幻方,运用罗伯特的楼梯法来构造最为简单,具体方法如下:(1)将1放在第一行中间一列;(2)从2开始直到n×n止各数依次按下列规则存放:按 45°方向行走,如向右上;每一个数存放的行比前一个数的行数减1,列数加1;(3)如果行列范围超出矩阵范围,则回绕。例如1在第1行,则2应放在最下一行,列数同样加1;(4)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
奇数幻方是不是很有趣呢?请你按照上述方法构造出指定奇数的奇数幻方吧!
输入
输入只有一行,一个正的奇数n(0<n<100)。
输出
输出nn的奇数幻方,共n行,每行n个整数(1<=整数<=nn)。
样例输入 Copy
3
样例输出 Copy
8 1 6
3 5 7
4 9 2
代码样例
#include<iostream>
#include<algorithm>
using namespace std;
const int N=110;
int a[N][N];
int main()
{
int n;cin>>n;int x=0,y=n/2;for(int i=1;i<=n*n;i++){
int dx=x-1,dy=y+1;a[x][y]=i;if(dx<0) dx+=n;else if(dx>=n) dx-=n;if(dy<0) dy+=n;else if(dy>=n) dy-=n;if(a[dx][dy]){
dx=x+1;dy=y;}x=dx;y=dy;}for(int i=0;i<n;i++){
for(int j=0;j<n;j++) cout<<a[i][j]<<" ";cout<<endl;}return 0;}