Tema
- Es decir, los valores horizontal y vertical se suman para ser iguales
ley:
-
1. El valor en la columna del medio de la primera fila es 1. Entonces, use j = n / 2 + 1 para determinar el número de columnas de 1 y obtenga a [1] [j] = 1.
-
2. El número de filas almacenadas en cada número es menor que el número de filas en el número anterior y el número de columnas se incrementa en 1. El número de filas está determinado por i = i-1, y el número de columnas está determinado por j = j + 1.
-
3. Si una línea numérica es la primera línea, la siguiente línea numérica es la última línea.
-
4. Si un número de fila de columna es la última columna, la siguiente columna de número es la primera columna.
-
5. Si hay un número en la posición determinada por las reglas anteriores, o el número anterior es la última columna de la primera fila, coloque el número siguiente debajo del número anterior.
solución:
- Utilice una matriz bidimensional para representar la realización.
- Exprese las cinco reglas anteriores con códigos
Implementación del lenguaje C
// 打印指定阶数的 魔方阵
#include <stdio.h>
int main()
{
int n, k , j, mo[50][50] = {
0};
printf("请输入打印魔方阵的阶数:\n");
scanf("%d", &n);
// k, j 表示初始的 数字 1 位置, 下面表示循环当前元素的 位置
k = 0;
j = n/2;
// 给数字 1 填入数组中
mo[k][j] = 1;
// 1已经填进去了,我们将其他数 通过规律填到数组当中
for(int i=2; i<=n*n; i++)
{
// 条件5 的数字该这样填进去
if ((k == 0 && j == n - 1) || mo[(k-1 + n)%n][(j+1+n)%n] != 0)
{
k = k +1;
mo[k][j] = i;
}
// 2,3,4 都是一个东西, 用 k = (k-1 + n)%n; 这种 取模的运算,假如 5阶的魔法阵,5 + 1 = 1
else
{
// 下一元素行
k = (k-1 + n)%n;
// 下一元素列
j = (j+1+n)%n;
mo[k][j] = i;
}
}
// 打印魔方阵
for(i = 0; i < n; i++)
{
for(int b = 0; b< n; b++)
{
printf("%6d", mo[i][b]);
}
printf("\n");
}
return 0;
}
Implementación de Python
- Por el momento, no esperaba una forma sencilla de implementación, ni escribir una versión de sintaxis de Python según el lenguaje C ~
- Una expresión de lista anidada se usa para generar una matriz bidimensional. De hecho, también se puede implementar usando numpy, array
n = int(input("请输入魔方阵的阶层:"))
# 使用嵌套列表推导式生成类似C语言的二维数组,元素均为0
mo = [[0 for i in range(n)] for i in range(n)]
k = 0
j = int(n/2)
mo[k][j] = 1
for i in range(2, n**2+1):
if (k==0 and j == n-1) or (mo[(k-1 + n)%n][(j+1+n)%n] != 0):
k += 1
mo[k][j] = i
else:
k = (k - 1 + n)%n
j = (j + 1 + n)%n
mo[k][j] = i
for i in mo:
print(i)