原题
打印魔方阵,魔方阵是指这样的方针,每一行、每一列以及对角线的和相等。例如三阶魔方阵:
8 1 6
3 5 7
4 9 2
编程打印奇数阶魔方阵。
提示
问题解决的关键是元素的填充,第一个元素1的位置在第一行正中,新的位置应该处于最近插入元素的右上方;但如果右上方的位置超出方针上边界,则新的位置应该取列的最下一个位置;超出右边界则取行的最左的一个位置;若最近插入的元素为n的整数倍,则选下面一行同列上的位置为新的位置。
实现代码
/*************************************************************************
> File Name: testmain.c
> Author: KrisChou
> Mail:zhoujx0219@163.com
> Created Time: Sun 17 Aug 2014 10:09:22 PM CST
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int size;
int row,col;
int num = 0;
int index;
size = atoi(argv[1]);
/* 动态分配二维数组,用于存放魔方阵 */
int **arr = (int**)calloc(size,sizeof(int*));
for(index = 0; index < size; index++)
{
arr[index] = (int*)calloc(size,sizeof(int));
}
/* 存放魔方阵 */
row = 0;
col = size >> 1;
arr[row][col] = ++num;
while(num < size * size)
{
if(num % size == 0)
{
row = (row + 1) % size;
col = col;
arr[row][col] = ++num;
}else
{
row = (row - 1 + size) % size;
col = (col + 1) % size;
arr[row][col] = ++num;
}
}
/* 打印 */
for(row = 0; row < size; row++)
{
for(col = 0; col < size; col++)
{
printf("%-3d",arr[row][col]);
}
printf("\n");
}
/* 释放存储空间 */
for(index = 0; index < size; index++)
{
free(arr[index]);
arr[index] = NULL;
}
free(arr);
arr = NULL;
return 0;
}