关于魔方阵的注释

autorun2010 2010-06-14 05:10:14
#include <stdio.h>

void main()
{
int a[16][16], i, j, k, p, m, n;
p = 1;
while(p == 1)
{
printf("请输入整数n, n的取值范围(0 < n <= 15, n为奇数): ");
scanf("%d", &n);
if((n != 0) && (n <= 15) && (n%2 != 0))
{
printf("矩阵阶数是:%d\n", n);
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;
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("%-3d", a[i][j]);
printf("\n");
}
}




今天做课后习题,有关魔方阵的算法,琢磨了很长时间一直没有明白,请高手帮忙给解释下算法呗,开通下我的思路,谢谢!
...全文
114 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
荆棘 2011-09-18
  • 打赏
  • 举报
回复
我也刚学这个不久
if((i <1)&&(j> n))
{
i=i+2;
j=j-1;
}

这一段,不太理解,1、(j>n)这个条永远不会满足吧,2、i=i+2又是怎么一回事?
yuanzhang198711 2010-06-15
  • 打赏
  • 举报
回复
谢谢AAA20090987同学,我今天终于知道了,醒悟太迟啊。
autorun2010 2010-06-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aaa20090987 的回复:]

C/C++ code
N 为奇数时,最简单
  (1) 将1放在第一行中间一列;
  (2) 从2开始直到n×n止各数依次按下列规则存放:
  按 45°方向行走,如向右上
  每一个数存放的行比前一个数的行数减1,列数加1
  (3) 如果行列范围超出矩阵范围,则回绕。
  例如1在第1行,则2应放在最下一行,列数同样加1;
  (4) 如果按上面规则确定的位置上已有数,或上一个数是……
[/Quote]

非常感谢,开通了不少,不过我还需要认真的多琢磨下,呵呵
love_19880826 2010-06-14
  • 打赏
  • 举报
回复
学习下。。。。。。。
stein42 2010-06-14
  • 打赏
  • 举报
回复
原来和魔方没关系啊
AAA20090987 2010-06-14
  • 打赏
  • 举报
回复
    N 为奇数时,最简单
  (1) 将1放在第一行中间一列;
  (2) 从2开始直到n×n止各数依次按下列规则存放:
  按 45°方向行走,如向右上
  每一个数存放的行比前一个数的行数减1,列数加1
  (3) 如果行列范围超出矩阵范围,则回绕。
  例如1在第1行,则2应放在最下一行,列数同样加1;
  (4) 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,
  则把下一个数放在上一个数的下面。


明白原理之后,程序就好理解了吧


xiaolinxianju 2010-06-14
  • 打赏
  • 举报
回复
友情帮顶

70,018

社区成员

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

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