打印魔方阵,魔方阵是指这样的方针,每一行、每一列以及对角线的和相等。例如三阶魔方阵:
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; }
原文:http://www.cnblogs.com/jianxinzhou/p/3918415.html