c语言编程魔阵,c语言编程魔阵,c语言编程魔阵,魔阵是由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函数来实现)
股票入门 我的第一次 你在做什么 往期内容 休闲牧场预告 设猫扑虎为首页|收藏猫扑虎
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);
}
}
  • 上一篇文章:
  • 下一篇文章: