我一直致力于生成一个魔方的代码,这个代码基本上是一个大小为nxn的二维数组,元素范围从1到n ^ 2,每列,行和对角线总和相同号。
这是我到目前为止所遇到的问题,它每次创建相同的2d数组。我首先将1放在最右边的中间行。这种方法是否允许我创建3个魔术方块?
std::cout << "Enter the size of a magic square: \n";
int n;
std::cin >> n;
int magicSquare[n][n];
// set all slots as 0
memset(magicSquare, 0, sizeof(magicSquare));
// Initialize position for 1
int row = n/2;
int col = n-1;
for (int num=1; num <= n*n; )
{
if (row==-1 && col==n)
{
row = 0;
col = n-2;
}
else
{
if (col == n)
col = 0;
if (row < 0)
row=n-1;
}
if (magicSquare[row][col])
{
col -= 2;
row++;
continue;
}
else
magicSquare[row][col] = num++;
col++;
row--;
}
答案 0 :(得分:1)
是的,你可以。魔术广场展示reflection symmetry。
您可以利用此属性制作其他魔术方块,作为示例:
以下是您的程序生成的基础 3x3魔术方:
2 9 4
7 5 3
6 1 8
+1:相同的方形水平镜像:
4 9 2
3 5 7
8 1 6
+2:原始方块垂直镜像:
6 1 8
7 5 3
2 9 4
+3:原始正方形水平和垂直镜像:
8 1 6
3 5 7
4 9 2
全部满足魔方的属性。