Red de conocimiento informático - Programación de la red - Hay una pregunta en el Capítulo 7 Matrices del lenguaje C de Tan Haoqiang:

Hay una pregunta en el Capítulo 7 Matrices del lenguaje C de Tan Haoqiang:

La construcción del cubo de Rubik plano se divide en tres situaciones: N es un número impar, N es múltiplo de 4 y N son otros números pares (en forma de 4n+2)

⑴ N es Cuando es un número impar, es el más simple

(1) Pon 1 en la columna del medio de la primera fila;

(2) A partir de 2 y terminando en n×n, los números se almacenan de acuerdo con las siguientes reglas:

Camine en la dirección de 45°, como hacia arriba y hacia la derecha.

El. el número de filas en las que se almacena cada número se reduce en 1 y el número de columnas aumenta en 1 en comparación con el número anterior

(3) Si el rango de filas y columnas excede el rango de la matriz, ajuste .

Por ejemplo, si 1 está en la fila 1, entonces 2 debe colocarse en la fila inferior y el número de columnas también se incrementa en 1;

(4) Si hay ya es un número en la posición determinada de acuerdo con las reglas anteriores, o cuando el número anterior es la fila 1 y la columna n,

coloque el siguiente número debajo del número anterior.

⑵ Cuando N es múltiplo de 4

Utilice el método de intercambio de elementos simétrico.

Primero, complete los números del 1 al n×n en la matriz de arriba a abajo y de izquierda a derecha.

Luego complete todas las matrices subcuadradas de 4×4 de la matriz cuadrada. Los números en las dos posiciones diagonales están emparejados con respecto al centro de la matriz cuadrada.

Se llama intercambio, es decir, a (i, j) se intercambia con a (n + 1). -i,n+1-j) y todas las demás posiciones. El número anterior permanece sin cambios.

(O puedes mantener la diagonal sin cambios e intercambiar otras posiciones simétricamente)

⑶ Cuando N es otro número par

Cuando n no es un múltiplo de 4 Cuando el número es par (es decir, forma 4n+2): primero descomponga la matriz cuadrada grande en 4 matrices subcuadradas de números impares (orden 2m+1).

De acuerdo con el cubo de Rubik de orden impar anterior, asigne los valores correspondientes a las cuatro matrices subcuadradas descompuestas

La submatriz superior izquierda es la más pequeña (i ), la submatriz inferior derecha es la más pequeña (i + v) y la submatriz inferior derecha es la más pequeña (i + v). La submatriz izquierda es la más grande (i + 3v). , y la submatriz superior derecha es la segunda más grande (i+2v)

Es decir, los elementos correspondientes de las cuatro matrices subcuadradas difieren en v, donde v=n*n/4

Las cuatro submatrices se organizan de pequeña a grande como ① ③

④ ②

Luego se intercambian los elementos correspondientes: a(i,j) y a(i+u ,j) Realiza los intercambios correspondientes en la misma columna (jn-t+2),

a(t-1,0) y a(t+u -1,0); Intercambia dos pares de elementos a(t-1,t-1) y a(t+u-1,t-1)

donde u=n/2, t= (n+2)/4 El intercambio anterior hace que cada fila y columna sea igual a la suma de los elementos en las dos diagonales.

snjsj Mi algoritmo de programa:

Este algoritmo de cuadrado mágico puede generar matrices cuadradas de cualquier orden excepto 2, y los resultados se guardan en el directorio donde se ejecuta el programa In the Magic. .txt, ábralo con IE o WordPad para mantener el formato consistente (principalmente porque el carácter de retorno de carro es un cuadro negro en el Bloc de notas y no se puede reconocer). Por supuesto, en un programa específico, existen limitaciones de espacio de memoria y rango de variables. Lo he probado y está bien si está dentro de 100.

Los algoritmos de orden par se basan en algoritmos de orden impar. Supongamos que el orden de la matriz cuadrada es n, entonces la constante de la matriz cuadrada mágica (es decir, la suma de los elementos de cada columna, fila y diagonal) es n*(n*n+1)/2.

Léalo junto con el código del programa; de lo contrario, es posible que no lo entienda. Puede utilizar un bolígrafo para calcular pequeños pasos mientras lee.

Hablemos primero del algoritmo de orden impar. Este es el algoritmo más sencillo:

n=2*m+1, m es un número natural

. 1) Convierta los números 1 y complete (0, (n+1)/2); tenga en cuenta que c comienza desde el subíndice 0

2) Complete los números de arriba a abajo a la derecha.

3) Según 2), cuando el subíndice de una columna se sale de los límites (más de n-1), la fila aumenta en 1, y el resto de n es el número de columnas que se llenado

4) Según 2), cuando el subíndice de una fila está fuera de los límites (más de n-1), la columna se incrementa en 1 y el resto de n es el número de filas a llenar;

5) Según 2), las filas y columnas no están fuera de los límites, pero se han agregado otros números, y el número debe completarse moviéndose una posición hacia la izquierda. de la posición actual.

Luego está el orden par:

Hay dos situaciones, una es n%4==2, la otra es n%4==0

El primero: n=2*(2*m+1), m es un número natural

1) Divida la matriz cuadrada de orden n en cuatro pequeñas matrices cuadradas mágicas ABCD y organícelas de la siguiente manera:

B C

D A

Porque n*n=4*(2*m+1)*(2*m+1),

Sea u =n/2=2*m+1, dividido en 1~u*u, u*u+1~2*u*u, 2*u*u+1~3*u*u, 3*u*u +1~4*u*u

Es decir, al llamar a la subfunción, pase los parámetros de la siguiente manera:

A(0),B( u*u),C(2 *u*u),D(3*u*u)

Complete el orden impar en ABCD de acuerdo con el método de llenado anterior (tenga en cuenta que los parámetros pasados ​​​​se agregan como base, a cada elemento se le debe agregar este valor), y finalmente realizar el siguiente intercambio:

(1) Los elementos en las filas 0~(m-1)-1 en B se intercambian con los correspondientes elementos en C

(2) Los elementos en cada fila de la fila (n-1)-m+1~(n-1)***m en D se intercambian con los elementos correspondientes en A

(3) Intercambiar D: (u+m,m) y el elemento correspondiente en A (valor del centro de la matriz)

(4) Intercambiar D: (n-1,m ) con el elemento correspondiente en A (en realidad, el valor máximo de la matriz) n*n)

La llamada posición correspondiente se refiere a la posición relativa de fila y columna con respecto a la esquina superior izquierda del pequeño matriz cuadrada mágica

Puedes probar lo anterior con matemáticas y usar la constante de matriz cuadrada mágica (nota la relación entre orden enésimo y orden uth)

Esta última: n=4*m , m es un número natural

Debido a que las filas y columnas son todas múltiplos de 4, la matriz completa se puede dividir en pequeñas matrices de 4*4 cada una.

Primero determine si un número está en la diagonal de una matriz pequeña dividida en 4*4.

Si es así, complete el número en esa posición como n*n-i. +1 (i es la posición relativa del elemento, comenzando desde 1. Por ejemplo, si el t-ésimo elemento en la s-ésima fila de orden n es i=s*n+t)

Si no, complete i.