c语言编程魔阵
来源:网络收集 作者:解语人 时间:2008-4-28 12:44:48
魔阵是由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;
}
else
{
k = j - n; // 当数k放好后,考虑数k+1的安放,总把它放在向上一行、...
if (k < 0)
{
k += m; // 1)要从最上一行向上,那么就转移到最下一行。
}
if (k % n == n - 1)
{
k -= n - 1; // 2)要从最右一列向右,那么就转移到最左一列。
}
else
{
k++; // ...向右一个位置
}
if (array[k] > 0)
{
k = j + n; // 3)如果企图放数的位置已经有了数,那么就把这个数放在它前面一个数的下面。
}
if (k >= m)
{
k -= m; // 补充一条:要从最后一行向下,那么就转移到最上一行
}
j = k;
}
array[j] = i;
}
// 为了输出魔阵时看起来美观,计算所有数字的最大位数
digit = 1;
while((m /= 10) > 0)
{
digit++;
}
// 输出魔阵
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf(" %*d", digit, array[i*n+j]);
}
printf("\n");
}
// 释放空间
free((char *)array);
}
}