魔方阵问题,诚望指教

herry168 2005-07-26 06:10:33
本人正在学习谭浩强先生的(C语言程序设计[第二版]),在第七章习题中有下面这道题, 感觉无从下手。诚望指点。
7.7 打印 “魔方阵 ”。
所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。
例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2


要求打印出其1到n平方的自然数构成的魔方阵。
...全文
346 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
herry168 2005-07-27
  • 打赏
  • 举报
回复
感谢大家

我结合 whq263(玄豹)和jixingzhong(瞌睡虫) 做了只有奇数的。偶数的做不出来。

#include <stdio.h>
#define MAX 30

void main()
{
int magic[MAX][MAX];
int i, j, row, col;
int count, size;

printf("Please input a size: ");
scanf("%d", &size);
if( size<1 || size>MAX )
{
printf("The size is overload!\n");
}
else if( size%2 ==0 )
{
printf("Input size is enve!\n");
}
else
{
for( i=0; i<size; i++ )
for( j=0; j<size; j++ )
magic[i][j] = 0;
magic[0][size/2] = 1;
i = 0;
j = size/2;
for( count=2; count<=size*size; count++ )
{
if(i==0)
i=size-1;
else
i=i-1;
if(j==0)
j=size-1;
else
j=j-1;
if(magic[i][j])
{
magic[row+1][col] = count;
i=row+1;
j=col;
}

else
{
magic[i][j] = count;
}
row=i;
col=j;
}
}
printf("The magic square is:\n");
for( i=0; i<size; i++ )
for( j=0; j<size; j++ )
{
printf("%5d", magic[i][j]);
if( j==size-1 )
printf("\n\n");
}
}

jixingzhong 2005-07-26
  • 打赏
  • 举报
回复
我以前看到的一个帖子


不过不是很全面


只有奇数魔方....
jixingzhong 2005-07-26
  • 打赏
  • 举报
回复
奇数阶的魔方有个固定的方法

(1)将1放在第一行中间一列;
(2)从2开始直到n×n止各数依次按下列规则存放: 每一个数存放的行比前一个数的行数减1,列数加1
(3)如果上一数的行数为1,则下一个数的行数为n(指最下一行)。例如1在第1行,则2应放在最下一行,列数同样加1;
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如2在第3行最后一列,则3应放在第2行第1列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。

例如按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。按此方法可以得到任何阶的魔方阵。


void FillOddMagicMatrix( int *addr, int n )
{
assert( n >= 3 && n % 2 ); // 检查是否有效的奇数阶

// 初始置零
memset( addr, 0, n * n * sizeof(int) );

// 第一行中间位置填 1
int i = 0, j = n / 2;
addr[ i * n + j ] = 1;

// 按向右上的斜线填充
for( int k=2; k<=n*n; ++k )
{
i = (i + n - 1) % n; // 循环上移一行
j = (j + 1) % n; // 循环右移一列

if( addr[ i * n + j ] != 0 ) // 该位置已有数值,到上一数的下一行
{
i = (i + 2) % n; // 下移二行
j = (j + n -1 ) % n; // 左移一列
}

addr[ i * n + j ] = k;
}
}
jixingzhong 2005-07-26
  • 打赏
  • 举报
回复
有一个古老的魔方阵赋值算法的



就是按照一定的顺序给方阵赋值



看看参考一下...
dirtysalt 2005-07-26
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3986/3986970.xml?temp=3.390139E-02
wenbinzndx 2005-07-26
  • 打赏
  • 举报
回复
不好做啊,n没有给出具体的值?等高手!
玄豹 2005-07-26
  • 打赏
  • 举报
回复
#include <stdio.h>
#define MAX 15

void main()
{
int magic[MAX][MAX];
int i, j, row, col;
int count, size;

printf("Please input a size: ");
scanf("%d", &size);
if( size<1 || size>MAX )
{
printf("The size is overload!\n");
}
else if( size%2 ==0 )
{
printf("Input size is enve!\n");
}
else
{
for( i=0; i<size; i++ )
for( j=0; j<size; j++ )
magic[i][j] = 0;
magic[0][size/2] = 1;
i = 0;
j = size/2;
for( count=2; count<=size*size; count++ )
{
row = (i-1<0)?(size-1):(i-1);
col = (j-1<0)?(size-1):(j-1);
if( magic[row][col] )
{
i = (++i)%size;
}
else
{
i = row;
j = (j-1<0)?(size-1):(--j);
}
magic[i][j] = count;
}
}
printf("The magic square is:\n");
for( i=0; i<size; i++ )
for( j=0; j<size; j++ )
{
printf("%3d", magic[i][j];
if( j==size )
printf("\n");
}
}
LoveYouJustOneDay 2005-07-26
  • 打赏
  • 举报
回复
奇数 -- 萝卜法
偶数 -- 由奇数构造

70,035

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧