C语言之幻方生成器
2016-06-05
幻方
幻方即一个n * n
(n
是奇数)的方格在各个位置依次填充1~n*n
的数值,并使得方格的每行、每列和每条对角线上的和都相等
算法
将 n * n
的方格视为二维数组。起始时把 1
放在0
行的中间,剩下的2,3 … n * n 依次向上移动一行并向右移动一列。当有可能越过数组边界时要绕回
到数组的另一端。
比如,需要把下一个数m
放到-1
行, 那么实际的行的位置就是 n - 1行(最后一行);如果需要把下一个数放到n
列,那么实际的位置就是0
列.
如果m
要移动到的某个位置已经被占用, 那就把该m
存储在m
的正下方
实现
#include <stdio.h>
#define LEN 5
/*
* 幻方生成器 n x n 方格的每行、每列、每条对角线上的和都相等
*/
int main(void)
{
int h[LEN][LEN] = {0},i,x,y;
int o_x,o_y;
x = LEN / 2;
y = 0;
h[x][y] = 1; //[中间列,0行]初始化1
for(i=2;i <= LEN * LEN;i++){
o_x = x;
o_y = y;
y--; //向上移动一行
if(y < 0){
//如果 y 越界
y = LEN + y;
}
x++; //向右移动一列
if( x >= LEN){
//如果 x 越界
x = x - LEN;
}
if(h[x][y] != 0){
//如果要移动的位置已经被占用
x = o_x;
y = o_y + 1; //放到前一个数的正下方
if(y >= LEN){
y = y - LEN;
}
}
h[x][y] = i;
}
//打印输出,注意, 按行(y)输出
for(y=0;y<LEN;y++){
for(x=0;x<LEN;x++){ //一列列输出
printf("%4d",h[x][y]);
}
printf("\n");
}
}
输出
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
如有问题, 欢迎指正