用C语言如何编程打印出由1到n^2的自然数构成的魔方阵,?

 我来答
百度网友36a786d
2018-01-06 · TA获得超过180个赞
知道答主
回答量:60
采纳率:0%
帮助的人:22.8万
展开全部
.初始化
创建n*n方阵(n为奇数), 并以0填充
以整数h表示方阵列, v表示方阵行
h = n-1
v = n/2
.初始化完毕

.定义
当前: 当前方阵行列位置(v, h)
下一: 下一方阵行列位置(v+1, h+1)
.定义完毕

.开始
1. 判断: 数是否填完
是: 结束
否: 当前: 填数
2. 判断: 下一 是否越界
是: 下一: 越界坐标置0
否: 继续
3. 判断: 下一 是否为0
是: 当前 = 下一, 转1
否: 当前: h减1, v不变, 转1
.结束

#include <stdio.h>
#include <stdlib.h>

/*----------------------------------------*/
struct stPOS {
int h;
int v;
}
cur, next;
/*--定义方阵行列表示方法:h表示列,v表示行--*/

int main()
{
int *piNumber;
int iSIZE, i, j;

/*-----------定义变量--------------*/

do {
printf( "输入n*n方阵大小(必须为奇数,输入-1退出): ");
scanf( "%d ", &iSIZE);
if (iSIZE == -1) exit(0);
if (!(iSIZE % 2))
printf( "\n错误,应该输入奇数\n ");
}
while (!(iSIZE % 2));
/*--------------------------------*/

if ((piNumber = (int *)malloc(iSIZE * iSIZE * sizeof(int))) == NULL) {
printf( "内存分配错误!\n ");
exit(1);
}

cur.h = iSIZE - 1;
cur.v = iSIZE / 2;
j = iSIZE * iSIZE;

for (i = 0; i < j; i++)
*(piNumber + i) = 0;

/*--------------初始化------------*/

for (i = 1; i <= j; ++i) {
*(piNumber + (iSIZE * cur.v) + cur.h) = i;
next.h = cur.h + 1;
next.v = cur.v + 1;
if (next.h == iSIZE) next.h = 0; /*判断: 下一 是否越界*/
if (next.v == iSIZE) next.v = 0;

if (*(piNumber + (iSIZE*next.v) + next.h) == 0) /*判断: 下一 是否为0*/
cur = next;
else
cur.h--;
}
/*-------------处理模块-----------*/

for (i = 0; i < j; ++i) {
if ( i%iSIZE == 0)
printf( "\n ");?

printf( "%d\t ", *(piNumber + i));
}

/*-------------打印结果-----------*/

free(piNumber);
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友ca331e8a
2018-05-28 · TA获得超过1.4万个赞
知道小有建树答主
回答量:243
采纳率:82%
帮助的人:7.5万
展开全部

奇数魔方阵就是将数字排列在nxn(n为奇数)的方阵上,要求满足各行、各列与各对角线的和相同。如下图所示,是n=5的奇数魔方阵。

填魔方阵的方法以奇数魔方阵最为简单,第一个数字放在第一行的正中央(填了1),然后向右(左)上填,如果右(左)上已有数字,则向下填,如下图所示:

一般程序语言的阵列多由0开始,为了计算方便,我们利用索引1到n的部份,而在计算是向右(左)上或向下时,我们可以将索引值除以n值,如果得到余数为1就向下,否则就往右(左)上。

4N 魔方阵

与奇数魔术方阵相同,在于求各行、各列与各对角线的和相等,不同的是这次方阵的维度是4的倍数。

先来看看4X4方阵的解法:

简单的说,就是一个从左上由1依序开始填,但遇对角线不填,另一个由左上由16开始填,但只填在对角线,再将两个合起来就是解答了。如果N大于等于2,则以 4X4为单位画对角线,如下所示:

至于对角线的位置该如何判断,有两个公式,有兴趣的可以画图印证,如下:

左上至右下:j % 4 == i % 4

右上至左下:(j % 4 + i % 4) == 1

8阶魔方阵(N=2)的结果如下:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式