题目


解决代码及点评
/*
功能:打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求打印由 1到 的自然数构成的魔方阵。
提示:魔方阵中各数的排列规律如下:
⑴ 将“1”放在第一行中间一列;
⑵ 从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;
⑶ 如果上一个数的行数为1,则下一个数的行数为 n(指最下一行);
⑷ 当一个数的列数为 n,下一个数的列数应为1,行数减1;
⑸ 如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。


*/

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

#define N 5 //N可以为任何奇数,因为偶数矩阵没有对角线,故不符合题意

void main(){
int a[N][N] = {0};
int num = 1;

int i = 0;
int j = N/2;

int ci = 0;
int cj = 0;


while (1){
a[i][j] = num++; //将num当前数存入a[i][j];
ci = i; //保存i当前值;
cj = j; //保存j当前值;

if (ci == 0)i = N - 1; //判断上一个是否在第0行
else i--;
if (cj == N - 1){ //判断上一个是否在第N-1列
j = 0;
i = ci-1;
}
else j++;
if (a[i][j] != 0 || (ci == 0 && cj == N - 1)){ //判断下一个位置是否被占有,或上一个是否在第0行,第N-1列
i = ci+1;
j = cj;
}

int flag = 0;
for (int u = 0; u < N; u++){ //判断矩阵是否已满
int flag1 = 0;
for (int v = 0; v < N; v++){
if (a[u][v] == 0){
flag1 = 1;
break;
}
}
if (flag1 == 1){
flag = 1;
break;
}
}
if (flag == 0)break; //flag=0说明矩阵已经填满,跳出循环
}

for (int u = 0; u < N; u++){ //打印矩阵
for (int v = 0; v < N; v++){
printf("%3d",a[u][v]);
}
printf("\n");
}
system("pause");
}


代码编译以及运行

由于资源上传太多,资源频道经常被锁定无法上传资源,同学们可以打开VS2013自己创建工程,步骤如下:

1)新建工程

2)选择工程

3)创建完工程如下图:

4)增加文件,右键点击项目

5)在弹出菜单里做以下选择

6)添加文件

7)拷贝代码与运行


程序运行结果