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)。
样例输入 Copy3 样例输出 Copy8 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; } |