菜鸟求助:关于魔方阵。。。来点好心人。。。

kooko1986 2009-10-22 01:57:22
#include<stdio.h>
#define N 16

int main()
{
int a[N][N]={0},i,j,k,p,m,n;
p=1;
while(p==1)
{
printf("Enter n(1~%d):",N-1);
scanf("%d",&n);
if((n!=0) && (n<N) && (n%2!=0))
p=0;
}
i=n+1; //这里开始赋值?
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("%4d",a[i][j]);
printf("\n");
}
return 0;
}
这个是打印魔方阵的程序。魔方阵就是一个矩阵,每一行和每一列和对角线的和都相等。
魔方阵的特点://分析:魔方阵有如下规律:
// 1:自然数1总是在方阵第一行当中一列上。
// 2:后续的自然数在当前数的右上方,
// 1)如果是在第一行则行数变为第n行列数加1 ;
// 2)如果是在最后一列,行数减1,列数为第1行。
// 3)如果后续的数所处位置已有数,则行数加1,列数不变。


谁帮我具体说说我看不懂的那几行的具体意思阿? 谢了。洗耳恭听!!!急 我把数字带进去一步步照着做都不对。应该是我没看懂那循环意思。 来人帮助帮助。
...全文
124 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
荆棘 2011-09-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cfz379945430 的回复:]
魔方阵的排列规律如下:
  (1)将1放在第一行中间一列;
  (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
  (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
  (4)当上一个数的列数为n时,下一个数的列数应为1,行数……
[/Quote]

"if((i <1) && (j>n)) //上一个数是第一行第n列时,则把下一个数放在上一个数的下面 "
请问,这一行中的注释:“第一行第n列时”,规则中好像没有吧!
kooko1986 2009-10-22
  • 打赏
  • 举报
回复
非常感谢,,,
ArmStronger 2009-10-22
  • 打赏
  • 举报
回复
魔方阵的排列规律如下:
  (1)将1放在第一行中间一列;
  (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
  (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
  (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
  (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;

#include <stdio.h> 
#define N 16

int main()
{
int a[N][N]={0},i,j,k,p,m,n;
p=1;
while(p==1)
{
printf("Enter n(1~%d):",N-1);
scanf("%d",&n);
if((n!=0) && (n <N) && (n%2!=0)) //1~n的奇数
p=0;
}
i=n+1;
j=n/2+1;

a[1][j]=1; //第一行中间列为 1

for(k=2;k <=n*n;k++) //从第二个数到第n*n个数
{
i=i-1; //规则一: 从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1
j=j+1;

if((i <1) && (j>n)) //上一个数是第一行第n列时,则把下一个数放在上一个数的下面
{
i=i+2;
j=j-1;
}
else
{
if(i <1) i=n; //如果上一个数的行数为1,则下一个数的行数为n(指最下一行)
if(j>n) j=1; //当上一个数的列数为n时,下一个数的列数应为1,行数减去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("%4d",a[i][j]);
printf("\n");
}
return 0;
}

69,373

社区成员

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

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