Peck Chen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

/*******************************************************************************
                                建立魔方阵
魔方阵中各个数的排列规律所示:
(1)将1放在第一行中间的一列
(2)从2开始直到n*n为止,各数依次按照下列规则存放:每一个数字存放的行比前一个的行数
减一, 列数加一;
(3)如果上一个数的行数为1, 则下一个数的行数为n(即最下一行);
(4)当上一个数的列数为n时, 下一个数的列数应该为1,行数减一;
(5) 如果按照上面规则确定的位置上已有数,或者上一个数是第1行第n列时, 则把下一个数
放在上一个数的下面.

 

说明:魔方阵形最大阶数只能为15, 所以定义数组array为16行16列,对第0行第0列不存放数
据, 而是从第一行第一列开始存放数, 以符合读者的习惯.
*******************************************************************************/

文字部分的算法是参考的,代码是自已写的,有错的话欢迎指正...^_^

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

int row, col;
int **map; /* 魔方阵形 */

/* 输入并初始化阶数 */
void input(int *row, int *col)
{
int m, n;

m
= 1;
while ( m )
{
printf(
"请输入方阵形阶数(奇数):");
scanf(
"%d", &n);
if (n > 0 && n < 16 && (n%2) != 0) /* 0~16内的奇数 */
{
m
= 0; /* 数据合法 */
*row = *col = n; /* 行、列数初始化 */
}
}
}
/* 输出n阶方阵 */
void output(int **map, int n)
{
int i, j;

for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
printf(
"%2.2d", map[i][j]);
if (j != n)
{
putchar(
'\t');
}
}

if (i == n)
{
putchar(
'\n');
}
else
{
printf(
"\n\n\n");
}
}
}
/* 获取魔方阵 */
void get_map(int **map, int row, int col)
{
int i, j, k;

i
= 1;
j
= col / 2 + 1;
map[
1][j] = 1;
for (k = 2; k <= row*col; k++)
{
i
--;
j
++;

if (i < 1 && j > row) /* 前一个数处于第一行最后一列 */
{
i
+= 2;
j
--;
}

/* 确保行、列下标合法 */
if (i < 1)
{
i
= row;
}
if (j > col)
{
j
= 1;
}


/* 当前位置有数 */
if (map[i][j] != 0)
{
i
+= 2;
j
--;
}

map[i][j]
= k;
}
}
/*清理资源*/
void release(int ***map, int row, int col)
{
int i, j;

for (i = 0; i <= row; i++)
{
free((
*map)[i]);
}
free(
*map);
}

int main()
{
int i, j;

input(
&row, &col);

/* 用calloc初始化map */
if ((map=(int **)calloc(row+1, sizeof(int *))) == NULL) {
printf(
"空间分配失败!\n");
exit(
-1);
}
for (i = 0; i <= row; i++)
{
if ((map[i]=(int *)calloc(col+1, sizeof(int))) == NULL) {
printf(
"空间分配失败!\n");
exit(
-1);
}
}

/* 获取魔方阵 */
get_map(map, row, col);

output(map, row);
printf(
"方阵阶数:%d\n", row);

release(
&map, row, col);

system(
"pause");
return 0;
}

 

posted on 2010-11-16 13:51  PeckChen  阅读(327)  评论(0编辑  收藏  举报