题目
本题是谭浩强《C程序设计课后习题》题6.7。
题目:输出“魔方阵”–每一行,每一列和对角线之和均相等。
例:3阶魔方阵
8 1 6
3 5 7
4 9 2
求:1-n^2的自然数构成的魔方阵。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
首先我们来了解一下魔方阵的生成方法:
1.先把第0行中间置为1.
2.下一个元素放在当前元素的上一行,下一列。
x=a[i-1][j+1]
3.如果上一行,下一列已有元素,则下一个元素存放在当前列的下一行。
x=a[i+1][j]
4.把矩阵看成是回绕的(像个球卷起来那样)
if i<0 i=最后一行
if j>size j=0
最后大家可以直接去看代码部分,基本上每一步我都标注了相关注释,程序易读性很高。
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
void main()
{
int n;//用于表示魔方阵的阶数
printf("请输入一个3-100之间的奇数,用于做魔方阵的阶数:");
scanf("%d", &n);
int a[100][100] = { 0 };//先定义一个阶数最大为100的未赋值的魔方阵。
int row, col;//定义两个变量用于存放魔方阵的行和列
int prerow, precol ;//定义两个变量用来存放当前行和列的值
row = 0;
col = n / 2;
a[row][col] = 1;//1.先把第0行中间的元素置为1.
int i, j;
for (i = 2; i <= n * n; i++)//因为已经赋值了一个1,所以i从2开始,需要赋值n*n-1次
{
row--;
col++;//2.下一个元素放在当前元素的上一行,下一列。
if (row < 0)
row = n - 1;//如果行是第-1行,就把他换成最后一行
if (col >= n)
col = 0;//如果列到达了-1列(也就是超过了最后一列),就将其置为第1列
//4.这两句的功能是把矩阵看成是回绕的(像个球卷起来那样)
if (a[row][col] != 0)//3.如果上一行,下一列已有元素,则下一个元素存放在当前列的下一行。
{
row = prerow + 1;//prerow是当前行+1就是下一行。
col = precol;//precol是当前列,不用变化。
}
a[row][col] = i;//这句代码是给魔方阵赋值的唯一语句,经过上面的3个if条件后,到这里进行相应的赋值。
prerow = row;
precol = col;//记录下来当前行和列的值
}
for (i = 0; i < n; i++)//用于输出已赋值后的n阶魔方阵
{
for (j = 0; j < n; j++)
printf("%-4d", a[i][j]);
printf("\n");
}
}
三、执行结果
输入:
请输入一个3-100之间的奇数,用于做魔方阵的阶数:5
输出:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9