X 我知道了TIPS:左右滑动导航栏可以查看更多栏目
:打印”魔方阵”,所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等.例如,三阶魔方为:
8 1 6
3 5 7
4 9 2
要求打印由1到n*n的自然数构成的魔方阵.
及待回复!!!!!!!!!!
>> 本文固定链接: http://www.vcgood.com/archives/961
>> 转载请注明: nacrompol 2006年08月05日 于 C语言帝国 发表
不会偶数幻方,只会做奇数幻方.规则是这样的:1写在第一行,中间那个位置.然后斜向上45度,找下一个位置,如果行或者列出界了,就写到另一端去.如果行和列同时出界.就写在该位置的下方.如果下一个位置已经有元素了,也写在位置的下方.
比如一个3*3幻方.1写在(1,2),然后下一个位置,(0,3),这时行就出界了,就写到另一端去,写在(3,3).下一个位置,(2,4),这时列又出界了,就写在另一端,(2,1).下一个位置是(1,2),可这个位置已经写过了,不能再写了,就写在这个位置的下面,是(2,1)的下面,(3,1).等到(1,3),下一个位置是(0,4),行和列同时出界,也写在下面,是(1,3)的下面(2,3).
#include <iostream.h>
void main(){ const int x = 9;//定义幻方的阶数
int n = 1;//要放置的元素 int a[x][x] = {0};//幻方全部置0 int i = 0; int j = x/2;//第一个位置是第0行,中间那个位置 while (n <= x*x) { a[i][j] = n; i–; j++;//找下一个位置 if (i<0 && j>(x-1))//如果行和列同时出界,就找下面的位置 { i += 2; j -= 1; }
if ( i < 0 )//如果只有一个出界,就写到另一端去. { i = x-1; } if (j > (x-1)) { j=0; }
if (a[i][j] != 0)//如果下一个位置上已经有元素了,也写在下面 { i += 2; j -= 1; } n++; }
//打印这个幻方 for (i=0; i<x; i++) { for (j=0; j<x; j++) { cout << setw(4) << a[i][j]; } cout << endl; }
}
如果你是用的是TC,把iostream.h换成stdio.h,下面所有的cout都换成printf,就可以在TC下编译了.
#include “stdio.h”
void main()
{int a[16][16],i,j,k,p,n;
p=1;
while(p==1)
{printf(“enter n(n=1 to 15):”);
scanf(“%d”,&n);
if((n!=0)&&(n<=15)&&(n%2!=0))
p=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;
a[1][j]=1; 注意是a[1][j]而不是a[i][j]
for(k=2;k<=n*n;k++)
{i=i-1;
j=j+1;
if((i<1)&&(j>n))
{i=i+2;
else
{if(i<1) i=n;
if(j>n) j=1;
if(a[i][j]==0)
a[i][j]=k;
j=j-1;
{for(j=1;j<=n;j++)
printf(“%5d”,a[i][j]);
printf(“\n”);
注意第21行应是y=y-1;而不是y=y+1;
你必须先 登录才能发表评论。
不会偶数幻方,只会做奇数幻方.规则是这样的:1写在第一行,中间那个位置.然后斜向上45度,找下一个位置,如果行或者列出界了,就写到另一端去.如果行和列同时出界.就写在该位置的下方.如果下一个位置已经有元素了,也写在位置的下方.
比如一个3*3幻方.1写在(1,2),然后下一个位置,(0,3),这时行就出界了,就写到另一端去,写在(3,3).下一个位置,(2,4),这时列又出界了,就写在另一端,(2,1).下一个位置是(1,2),可这个位置已经写过了,不能再写了,就写在这个位置的下面,是(2,1)的下面,(3,1).等到(1,3),下一个位置是(0,4),行和列同时出界,也写在下面,是(1,3)的下面(2,3).
#include <iostream.h>
void main()
{
const int x = 9;//定义幻方的阶数
int n = 1;//要放置的元素
int a[x][x] = {0};//幻方全部置0
int i = 0;
int j = x/2;//第一个位置是第0行,中间那个位置
while (n <= x*x)
{
a[i][j] = n;
i–;
j++;//找下一个位置
if (i<0 && j>(x-1))//如果行和列同时出界,就找下面的位置
{
i += 2;
j -= 1;
}
if ( i < 0 )//如果只有一个出界,就写到另一端去.
{
i = x-1;
}
if (j > (x-1))
{
j=0;
}
if (a[i][j] != 0)//如果下一个位置上已经有元素了,也写在下面
{
i += 2;
j -= 1;
}
n++;
}
//打印这个幻方
for (i=0; i<x; i++)
{
for (j=0; j<x; j++)
{
cout << setw(4) << a[i][j];
}
cout << endl;
}
}
如果你是用的是TC,把iostream.h换成stdio.h,下面所有的cout都换成printf,就可以在TC下编译了.
#include “stdio.h”
void main()
{int a[16][16],i,j,k,p,n;
p=1;
while(p==1)
{printf(“enter n(n=1 to 15):”);
scanf(“%d”,&n);
if((n!=0)&&(n<=15)&&(n%2!=0))
p=0;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1;
a[1][j]=1; 注意是a[1][j]而不是a[i][j]
for(k=2;k<=n*n;k++)
{i=i-1;
j=j+1;
if((i<1)&&(j>n))
{i=i+2;
j=j+1;
}
else
{if(i<1) i=n;
if(j>n) j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else
{i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf(“%5d”,a[i][j]);
printf(“\n”);
}
}
注意第21行应是y=y-1;而不是y=y+1;