Red de conocimientos turísticos - Información de alquiler - Aplicación del problema de los treinta y seis oficiales

Aplicación del problema de los treinta y seis oficiales

Este tipo de matriz cuadrada se denomina cuadrado latino ortogonal en las matemáticas combinatorias modernas y se utiliza ampliamente en la producción industrial y agrícola y en experimentos científicos. Se ha demostrado que, excepto los de orden 2 y 6, se pueden construir todos los cuadrados latinos ortogonales de orden 3, 4, 5, 7, 8, ....

Además de la definición anterior, cabe señalar que cada combinación no se puede repetir. Por ejemplo, el fundador de segundo orden tendrá una situación similar a la siguiente:

(. 1, 1) (2, 2)

(2, 2) (1, 1)

Debido a repeticiones similares a (1, 1), es imposible que los 36 Los oficiales tienen el problema de estar en diferentes posiciones al mismo tiempo, por lo que no se satisface la demanda, por lo que el cuadrado de segundo orden no existe.

Según la programación informática, es fácil encontrar los cuadrados de orden 3, 4 y 5. Como hay muchas combinaciones, aquí tienes algunos ejemplos:

Orden 3:

( 1,1) (2, 2) (3,3)

(2,3) (3,1) (1,2)

(3,2) (1 ,3) (2,1 )

Nivel 4:

(2,1) (4,4) (3,2) (1,3)

(4,2) (2,3) (1,1) (3,4)

(3,3) (1,2) (2,4) (4,1)

( 1,4) (3,1) (4,3) (2,2)

Nivel 5:

(1,1) (2 ,2) (3,5 ) (4,3) (5,4)

(4,5) (1,3) (5,2) (3,4) (2,1)

(2,4) (5,5) (4,1) (1,2) (3,3)

(5,3) (3,1) ( 1,4) (2, 5) (4,2)

(3,2) (4,4) (2,3) (5,1) (1,5)

c El código es el siguiente: #include?lt;iostreamgt;#define?ARMY_SIZE?5typedef?struct?snode?{ int?x;}node; ?y); bool?can_set(int? x,?int?y,?int?i,?int?j);void?set_next(int?x,?int?y);?nodo?nodos[ARMY_SIZE][ ARMY_SIZE];int?main(void){ memset(nodos,?0,?sizeof(nodos)); set_value(0,?0); std::cout?lt;lt;?end...?lt;lt; ;?std::endl;?std: :cin.get();? return?0;?}void?set_value(int?x,?int?y){ para?(int?i?=?1;? i?lt;?ARMY_SIZE? ?1; ?i)?{ para?(int?j?=?1;?j?lt;?ARMY_SIZE? ?1;?j)?{ si?(can_set(x,? y,?i,?j))? { nodos[x][y].x?=?i; nodos[x][y].y?=?j; ][y].x?=?0 ; nodos[x][y].y?=?0; } } }}bool?can_set(int?x, ?int?y, ?int?i, ?int? j){ para?(int?_x? =?0;?_x?lt;?x;? _x)?{ si?(nodos[_x][y].x?==?i?||?nodos[ _x][y].y?== ?j) return?false } para?(int?_z?=?0;?_z?lt;?x;? _

z)?{ for?(int?_i?=?0;?_i?lt;?ARMY_SIZE;? _i)?{ if?(nodos[_z][_i].x?==?i?amp;amp; ?nodos[_z][_i].y?==?j)?{ return?false } } } para?(int?_y?=?0;?_y?lt;?y;? _y)?{ si ?(nodos[x][_y].x?==?i?||?nodos[x][_y].y?==?j) return?false } return?true; int?x,?int?y){ si?(y? ?1?==?ARMY_SIZE)?{ si?(x? ?1?==?ARMY_SIZE)?{ para?(int?i?=?0 ;?i?lt;?ARMY_SIZE;? i)?{ para?(int?j?=?0;?j?lt;?ARMY_SIZE;? j)?{ std::cout?lt;lt;?(? lt;lt;?nodos[i][j].x?lt;lt;?,?lt;lt;?nodos[i][j].y?lt;lt;?)?; ?lt;lt;?std::endl;} std::cout?lt;lt;?****************************** ** *********?lt;lt;?std::endl; }?else?{ set_value(x? ?1,?0); ? 1);