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

如有问题, 欢迎指正