<组合数学>幻方

我们小时候都玩过数独,数独就是以幻方为基础的游戏。

 

 

行/列的整数和为该幻方的幻和

我们用s表示幻和。

对于一个n阶的幻方,幻和

  s = n*(n*n+1) /2

 

容易证明,二级幻方不存在。

三十多年前,有人已证明:n>=3阶的幻方都是存在的。

 

循环轮回法构造三阶幻方的模拟:(c语言)

 

#include 
/*
a simple demo for construction of 3-magic-square

author@DynmiWang
*/
int arr[3][3];
int x, y;
void get_next(int a,int b)
{
    a--;
    b++;
    if(a<0)
    {
        a += 3;
    }
    if(b<0)
    {
        b += 3;
    }
    a = a % 3;
    b = b % 3;
    if(arr[a][b]!=0)
    {
        a = x;
        b = y;
        a++;
    }   
    x = a;
    y = b;
    if(arr[x][y]!=0)
    {
        get_next(x,y);
    }
}
int main()
{
    printf("请输入构造起点:\n");
    scanf("%d %d", &x, &y);
    printf(" ##%d %d \n", x, y);
    x++;
    y--;
    int p = 1;
    while(p<10)
    {
        get_next(x,y);
        printf(" ##%d %d %d\n", x, y, p);
        arr[x][y] = p;
        for (int i = 0; i < 3;i++)
        {
            for (int j = 0; j < 3;j++)
            {
                printf("%d  ", arr[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        p++;
    }
    return 0;
}

 

 

对于奇数阶幻方均可以使用上述轮回反复法;

另外对于4m阶幻方和4m+2阶幻方各有一种解法。

 

在不计重复翻转的情况下,(允许翻转重复的话x8)

3阶幻方有  1   种排列法;

4阶幻方有  880  种排列法;

5阶幻方有  2亿7千多   种排列法

.......

 

你可能感兴趣的:(<组合数学>幻方)