c语言编程魔阵

来源:百度知道 编辑:UC知道 时间:2024/06/03 06:37:54
魔阵是由1到n2这些整数排成 方阵,其中每一行,每一列和两个对角线上的数之和相同。下面是一个构造奇数阶魔阵的通用算法:先把1放在第一行中间。当数k放好后,考虑数k+1的安放,总把它放在向上一行、向右一个位置。下面是各种特殊情况的处理:
1)要从最上一行向上,那么就转移到最下一行。
2)要从最右一列向右,那么就转移到最左一列。
3)如果企图放数的位置已经有了数,那么就把这个数放在它前面一个数的下面。
本题要求输入一个奇数n,然后打印出n阶魔阵。例如,输入的n为3时,应输出如下方阵:
8 1 6
3 5 7
4 9 2
(本题需用到动态二维数组,在C语言中可用malloc函数和free函数来实现)

以下代码可以完成要求,已经调试通过,仅供参考。

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

void print_magic_array(int n);

void main(int argc, char *argv[])
{
int n;

if (argc != 2)
{
fprintf(stderr, "Usage: %s odd_numeral\n", argv[0]);
exit(0);
}
n = atoi(argv[1]);
if ((n <= 0) || (n % 2 != 1))
{
fprintf(stderr, "Error: positive and odd numeral needed.\n");
exit(1);
}
print_magic_array(n);
}

void print_magic_array(int n)
{
int *array;
int i;
int j;
int k;
int m = n * n;
int digit;

array = (int *)malloc(m * sizeof(int));
if (array != (int *)NULL)
{
memset(array, 0, m * sizeof(int));
for(i = 1; i <= m; i++)
{
if (i == 1) // 先把1放在第一行中间
{
j = n / 2;
}
e