所谓“幻方”就是一个n*n 的矩形,在这个矩形中有规律的填入数值为 1—n2个数字,并且满足它的行,列,对角线的和相等.输入奇数n,输出n阶的奇数幻方
来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/08 19:58:23
所谓“幻方”就是一个n*n 的矩形,在这个矩形中有规律的填入数值为 1—n2个数字,并且满足它的行,列,对角线的和相等.输入奇数n,输出n阶的奇数幻方
所谓“幻方”就是一个n*n 的矩形,在这个矩形中有规律的填入数值为 1—n2个数字,并且满足它的行,列,对角线的和相等.
输入奇数n,输出n阶的奇数幻方
所谓“幻方”就是一个n*n 的矩形,在这个矩形中有规律的填入数值为 1—n2个数字,并且满足它的行,列,对角线的和相等.输入奇数n,输出n阶的奇数幻方
用楼梯法最快.
奇数阶幻方最经典的填法是罗伯特法(也有人称之为楼梯方).填写方法是这样:
把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n*n-1个数:
(1)、每一个数放在前一个数的右上一格;
(2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
(3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
(4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;
(5)、如果这个数所要放的格已经有数填入,处理方法同(4).
这种写法总是先向“右上”的方向,象是在爬楼梯.
需讨论,可以百度嗨我.
有几种方法:
(1)当n为奇数时,我们称幻方为奇阶幻方.可以用Merzirac法与loubere法实现,根据我的研究,发现用国际象棋之马步也可构造出更为神奇的奇幻方,故命名为horse法.
horse法生成奇阶幻方 先在任意一格内放入1.向左走1步,并下走2步放入2(称为马步),向左走1步,并下走2步放入3,依次类推放到n.在n的下方放入n+1(称为跳步),再按上述方法放置到2n,在2n的下边放入2n+1.
(2)Merzirac法生成奇阶幻方 在第一行居中的方格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向下移一格继续填写.
(3)loubere法生成奇阶幻方 在居中的方格向上一格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向上移二格继续填写.
(4)罗伯法:
1居上行正中央,仿次斜填莫相忘,上出框时往下填,
右出框时左边放,排重便在下格填,右上排重一个样.
(与罗伯法一样)3阶幻方解法 :
戴九履一,四二为肩,三七为腰,八六为足,五居中央.
8 1 6
3 5 7 3阶幻方
4 9 2
编写一个C++程序即可完成你所说的输入奇数n,输出n阶的奇数幻方。
#include
using namespace std;
int main()
{
int n;
cin >> n;
int a[n+1][n+1], i, j, k, bi, bj;
for(i=1;i<=n;i++)
f...
全部展开
编写一个C++程序即可完成你所说的输入奇数n,输出n阶的奇数幻方。
#include
using namespace std;
int main()
{
int n;
cin >> n;
int a[n+1][n+1], i, j, k, bi, bj;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
a[1][n/2+1] = 1;
i = 1;
j = n/2+1;
for(k=2;k<=n*n;k++)
{
if (i-1==0 && j-1==0)
{i=i+1;}
else if( i-1==0 && j-1!=0)
{i=n;j=j-1;}
else if(i-1!=0 && j-1==0)
{i=i-1;j=n;}
else if (a[i-1][j-1]!=0)
{i=i+1;}
else
{i=i-1;j=j-1;}
a[i][j]=k;
}
for(i=1;i<=n;i++)
{
for(j=1;j
cout << a[i][n] << endl;
}
return 0;
}
收起
那你的问题具体是?