幻方阵是一个矩阵,即将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;
}
直接的数学公式。
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;