X 我知道了TIPS:左右滑动导航栏可以查看更多栏目
原题是这样的:
所谓魔方阵是指这样的一个方阵,它的每一行,每一列与对角线各元素之和均相等。例如,三阶魔方阵为:
8 1 6
3 5 7
4 9 2
请打印出由1到n2(n的平方)的自然数构成的魔方阵。
请诸位指点一下思路,小弟在此行礼了。
>> 本文固定链接: http://www.vcgood.com/archives/2150
>> 转载请注明: szc0000 2008年02月16日 于 C语言帝国 发表
上个帖子还有一个回复。这个直接没人理……都说问题有点深度人家才会回答,可是我现在的水平实在提不出有深度的问题来啊……真的没人肯指点一下么?
先把1放在第一行中间的位置
然后依次把各个数向右上方来写
碰到边界或者是应该写数的地方已经被占满了
就在应该写数的各的正下方的格来写
若下方也满了 或者 到达边界 则写到最上
直至写满
#include <stdio.h>void main(){ int array[16][16]; //魔方的最大阶数:15 int i,j,k,m,n; m=1; while(m==1) { printf(“请输入n(0—15),n是奇数:”); scanf(“%d”,&n); if(n!=0&&(n%2!=0)&&(n<=15))//距阵的阶的合法性 { printf(“矩阵阶数是%d\n”,n); m=0; } } for(i=1;i<=n;i++) //赋初值 { for (j=1;j<=n;j++) array[i][j]=0; }
j=n/2+1; //产生魔方开始 array[1][j]=1; //1: for(k=2;k<=n*n;k++) //下标从2开始,到n*n结束 { i=i-1; //正常排列:行-1 j=j+1; //正常排列:列+1 if((i<1)&&(j>n)) { i=i+2; j=j-1; } else { if(i<1) i=n; if(j>n) j=1; } if(array[i][j]==0) array[i][j]=k; else { i=i+2; j=j-1; array[i][j]=k; } } //产生魔方结束 for(int i=1;i<=n;i++) //输出魔方 { for(j=1;j<=n;j++) printf(“%5d”,array[i][j]); printf(“\n”); }}//(1)将1放在第一行中间的一列;//(2)从2开始直到n*n为止,各数依次按照下列规则存放:每一个数字存放的行比前一个数的行数减一,列数加一;//(3)如果上一个数的行数为1,则下一个数的行数为n(即最下一行);//(4)当上一个数的列数为n时,下一个数的列数应该1,行数减一;//(5)如果按照上面规则确定的位置上已有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
……这个见鬼的魔方阵原来这么麻烦?教材居然拿来当课后题……不过好像没有用到太复杂的函数,只是程序长了点。让我好好学习一下。
谢谢二楼和三楼的两位。三楼的程序我保存下来了,慢慢研究。谢谢您了!
你必须先 登录才能发表评论。
上个帖子还有一个回复。这个直接没人理……都说问题有点深度人家才会回答,可是我现在的水平实在提不出有深度的问题来啊……真的没人肯指点一下么?
先把1放在第一行中间的位置
然后依次把各个数向右上方来写
碰到边界或者是应该写数的地方已经被占满了
就在应该写数的各的正下方的格来写
若下方也满了 或者 到达边界 则写到最上
直至写满
#include <stdio.h>
void main()
{
int array[16][16]; //魔方的最大阶数:15
int i,j,k,m,n;
m=1;
while(m==1)
{
printf(“请输入n(0—15),n是奇数:”);
scanf(“%d”,&n);
if(n!=0&&(n%2!=0)&&(n<=15))//距阵的阶的合法性
{
printf(“矩阵阶数是%d\n”,n);
m=0;
}
}
for(i=1;i<=n;i++) //赋初值
{
for (j=1;j<=n;j++)
array[i][j]=0;
}
j=n/2+1; //产生魔方开始
array[1][j]=1; //1:
for(k=2;k<=n*n;k++) //下标从2开始,到n*n结束
{
i=i-1; //正常排列:行-1
j=j+1; //正常排列:列+1
if((i<1)&&(j>n))
{
i=i+2;
j=j-1;
}
else
{
if(i<1)
i=n;
if(j>n)
j=1;
}
if(array[i][j]==0)
array[i][j]=k;
else
{
i=i+2;
j=j-1;
array[i][j]=k;
}
} //产生魔方结束
for(int i=1;i<=n;i++) //输出魔方
{
for(j=1;j<=n;j++)
printf(“%5d”,array[i][j]);
printf(“\n”);
}
}
//(1)将1放在第一行中间的一列;
//(2)从2开始直到n*n为止,各数依次按照下列规则存放:每一个数字存放的行比前一个数的行数减一,列数加一;
//(3)如果上一个数的行数为1,则下一个数的行数为n(即最下一行);
//(4)当上一个数的列数为n时,下一个数的列数应该1,行数减一;
//(5)如果按照上面规则确定的位置上已有数,或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
……这个见鬼的魔方阵原来这么麻烦?教材居然拿来当课后题……不过好像没有用到太复杂的函数,只是程序长了点。让我好好学习一下。
谢谢二楼和三楼的两位。三楼的程序我保存下来了,慢慢研究。谢谢您了!