/*******************************************************************************
建立魔方阵
魔方阵中各个数的排列规律所示:
(1)将1放在第一行中间的一列
(2)从2开始直到n*n为止,各数依次按照下列规则存放:每一个数字存放的行比前一个的行数
减一, 列数加一;
(3)如果上一个数的行数为1, 则下一个数的行数为n(即最下一行);
(4)当上一个数的列数为n时, 下一个数的列数应该为1,行数减一;
(5) 如果按照上面规则确定的位置上已有数,或者上一个数是第1行第n列时, 则把下一个数
放在上一个数的下面.
说明:魔方阵形最大阶数只能为15, 所以定义数组array为16行16列,对第0行第0列不存放数
据, 而是从第一行第一列开始存放数, 以符合读者的习惯.
*******************************************************************************/
文字部分的算法是参考的,代码是自已写的,有错的话欢迎指正...^_^
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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;
}