Datahub
数据改变生活

1053: 奇数幻方

发表时间:2022-10-27 19:08

1053: 奇数幻方

时间限制: 1 Sec   内存限制: 128 MB

题目描述

幻方(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)。

输出

输出n*n的奇数幻方,共n行,每行n个整数(1<=整数<=n*n)。

样例输入 Copy

3

样例输出 Copy

8 1 6

3 5 7

4 9 2

#include<bits/stdc++.h>

using namespace std;

int n,k1,k2,x;

int main(){

int a[105][105];

cin>>n;

memset(a,0,sizeof(a));

a[0][n/2]=1;

int i=0,j=n/2;

for(x=2;x<=n*n;x++){

k1=i;k2=j;i--;j++;

if(i==-1) i=n-1;

if(j==n) j=0;

if(a[i][j]!=0||((k1==0)&&(k2==n-1))){

a[k1+1][k2]=x;

j=k2;i=k1+1;

}

else a[i][j]=x;

}

for(i=0;i<n;i++){

for(j=0;j<n;j++)

printf("%d ",a[i][j]);

printf("\n");

}

return 0;

}


文章分类: 算法例题
分享到:
QQ:258506508                                     联系电话:020-000000    000-000000                                   联系邮箱:xxx@.co.m                                     联系地址:XXX省XXX市XXX县XXX路