左右间

行走在左右之间

博客园 首页 新随笔 联系 订阅 管理
幻方阵是一个矩阵,即将n*n(n>=3)个数字放入n*n的方格内,使方格的各行、各列及对角线上各数字之各相等。

Merzirac 算法。
在第最上面一行居中的方格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向下移一格继续填写。如果坐标值超出上限,则归0,如果坐标值超出下限,则变为最大坐标值。

实现:
public static int[,] Generat(int n)
        {
            int[,] matrix = new int[n, n];

            int x = n / 2;
            int y = n-1;
            int maxNumber = n*n;
            for (int i = 1; i <= maxNumber; i++)
            {
                //修正坐标
                x = GetRealPositon(x, n);
                y = GetRealPositon(y, n);

                if (matrix[x, y] != 0)
                {
                    //到原始方格的正下方方格
                    x--;
                    y = y-2;
                    //修正坐标
                    x = GetRealPositon(x, n);
                    y = GetRealPositon(y, n);

                    //寻找原始方格的正下方中未被附值的方格
                    while (matrix[x, y] != 0)
                    {
                        y--;
                        y = GetRealPositon(y, n);
                    }
                }

                matrix[x, y] = i;

                //到右上角
                x++;
                y++;
            }

            return matrix;
        }

        private static int GetRealPositon(int x, int n)
        {
            if (x < 0)
                return n - 1;
            else if (x >= n)
                return 0;
            else
                return x;
        }

直接的数学公式。

N(I,J)=((I+J+(n-3)/2) MOD n)*n+(I-J+(3*n-1)/2) MOD n +1;

 

 

posted on 2009-01-16 16:51  左右间  阅读(551)  评论(0编辑  收藏  举报