主题:[原创]奇数魔方
zhangyuan
[专家分:630] 发布于 2006-12-23 19:06:00
把整数1到n填入n行n列的方阵,使n行n列的方阵每行每列每对角线相等,我想了半天也想不出来……大家教教我
[em8][em8]
如
输入
3
输出
6 1 8
7 5 3
2 9 4
回复列表 (共8个回复)
沙发
battle [专家分:650] 发布于 2006-12-24 00:03:00
#include<iostream.h>
#include<iomanip.h>
void PrintMagicTable(int **a,int n);
void main()
{
int num,i,j;
cout<<"please input the number: ";
cin>>num;
while(0==num%2)
{
cout<<"error input,please input again: ";
cin>>num;
}
int **a=new int *[num];
for(i=0;i<num;i++)
a[i]=new int[num];
for(i=0;i<num;i++)
for(j=0;j<num;j++)
a[i][j]=0;
PrintMagicTable(a,num);
delete []a;
}
void PrintMagicTable(int **a,int n)
{
int r,c,number;
c=n/2;
r=0;
a[r][c]=1;
for(number=2;number<=n*n;number++)
{
r=r-1;
c=c+1;
if((r<0)&&(c>n-1))
{
r=r+2;
c=c-1;
}
else
{
if(r<0)
r=n-1;
if(c>n-1)
c=0;
}
if(0==a[r][c])
a[r][c]=number;
else
{
r=r+2;
c=c-1;
a[r][c]=number;
}
}
for(r=0;r<n;r++)
{
for(c=0;c<n;c++)
cout<<setw(5)<<a[r][c];
cout<<endl<<endl;
}
}
只适合奇数; [em9][em9][em9]
板凳
雪光风剑 [专家分:27190] 发布于 2006-12-24 04:30:00
这是c++的程序
怎么直接贴pascal来了?
3 楼
雪光风剑 [专家分:27190] 发布于 2006-12-24 04:34:00
奇阶幻方填数法:从任意位置填1(个别位置可能造成幻方不存在),然后向右上递增填数,上越界就回到最下面,右越界就回到最左面。如果下一个数的位置已经被占用那么把数填到当前数字的正下方
很简单的,自己实现吧
我们当初集训的时候还简单实现过偶阶幻方来的
4 楼
battle [专家分:650] 发布于 2006-12-25 22:05:00
不好意思,看错了
SORRY!!!!!!!!
5 楼
dorremon1992 [专家分:870] 发布于 2006-12-30 21:34:00
偶数幻方似乎编程不能实现
及时要实现,代码也很复杂
6 楼
雪光风剑 [专家分:27190] 发布于 2006-12-30 23:36:00
可以实现
只是很复杂
我初中的时候写过
只是忘光了
是分块换数的
7 楼
zhadalou [专家分:480] 发布于 2006-12-31 22:57:00
我作了一个任意阶的,是用foxpro作的:
http://bbs.pfan.cn/post-33275.html
8 楼
abcwuhang [专家分:1840] 发布于 2007-01-16 19:10:00
每行的和 每列的和 每对角线的和都相等,和可以计算出来:
n阶每行和:n*(1+n*n)/2,最后再凑出来就OK了
我来回复