Codeforces 1333E Road to 1600

Descripción

Dé un $ n \ times n $ tablero con $ n \ times n $ enteros entre $ [1, n \ times n] $ que son diferentes entre sí.

Hay un auto y uno en el tablero de ajedrez, e inicialmente están en el número $ 1 $.

La forma de caminar es la siguiente:

  • El automóvil puede alcanzar cualquier posición (no visitada por usted) en la misma fila o columna, y luego puede alcanzar cualquier posición (no visitada por usted) en la misma fila, columna o barra oblicua;
  • Cada vez que el automóvil va y viene, irá al número más pequeño que se pueda alcanzar. Si no existe, se transmitirá a la posición del número más pequeño en toda la pizarra que no haya visitado usted a un costo de $ 1 $.

Encuentre una solución que satisfaga que el costo de la finalización del automóvil es estrictamente menor que el costo de la finalización del final, o envíe $ -1 $ para indicar que no existe tal solución.

Solución

En primer lugar, descubrí que $ n \ le 2 $ no se podía hacer.

Entonces $ n = 3 $ se puede calcular violentamente. Por ejemplo, el siguiente esquema es legal:

Entonces, si $ n> 3 $, ¿se puede transformar en un problema de $ n = 3 $?

Una forma es no tener efecto en la posición exterior, solo funcionarán las nueve cuadrículas en la esquina superior izquierda.

Es decir, solo necesitamos asegurarnos de que ambas piezas puedan envolverse alrededor del exterior y luego ingresar la cuadrícula de nueve cuadrados en la esquina superior izquierda. Por ejemplo, el siguiente es el método de construcción de $ n = 5 $:

$$ \ begin {matrix} \ color {red} 1 \ color {blue} {+ 16} & \ color {red} 7 \ ​​color {blue} {+ 16} & \ color {red} 9 \ color {blue} {+ 16} & 7 \ to & 8 \ downarrow \\ \ color {red} 3 \ color {blue} {+ 16} & \ color {red} 2 \ color {blue} {+ 16} & \ color {red { } 5 \ color {azul} {+ 16} y 6 \ uparrow y 9 \ downarrow \\ \ color {rojo} 4 \ color {azul} {+ 16} y \ color {rojo} 8 \ color {azul} {+ 16} & \ color {rojo} 6 \ color {azul} {+ 16} y 5 \ uparrow & 10 \ downarrow \\ 1 \ to \ & 2 \ to & 3 \ to & 4 \ uparrow & 11 \ downarrow \\ 16 \ gets & 15 \ gets & 14 \ gets & 13 \ gets & 12 \ gets \ end {matrix} $$

Entonces se trata de cómo completar un grupo popular.

El código es solo de referencia.

#include <bits / stdc ++. h> 
usando el espacio de nombres std; 
const int N = 505; 
int n, a [N] [N]; 
int main () 
{ 
	scanf ("% d", & n); 
	if (n <= 2) return put ("- 1") && 0; 
	int cnt = 0, outmax = n * n - 9; 
	a [1] [1] = 1 + outmax; a [1] [2] = 7 + outmax; a [1] [3] = 9 + outmax; 
	a [2] [1] = 3 + outmax; a [2] [2] = 2 + outmax; a [2] [3] = 5 + outmax; 
	a [3] [1] = 4 + outmax; a [3] [2] = 8 + salida máxima; a [3] [3] = 6 + outmax; 
	para (int i = 1; i <= n - 3; i ++) 
	{ 
		if (i & 1) 
		{ 
			for (int j = 1; j <= i + 2; j ++) a [i + 3] [j] = ++ cnt; 
			a [i + 3] [i + 3] = ++ cnt; 
			para (int j = i + 2; j> = 1; j--) a [j] [i + 3] = ++ cnt;
			para (int j = 1; j <= i + 2; j ++) a [j] [i + 3] = ++ cnt; 
			a [i + 3] [i + 3] = ++ cnt; 
			para (int j = i + 2; j> = 1; j--) a [i + 3] [j] = ++ cnt; 
		} 
	} 
	para (int i = 1; i <= n; i ++, pone ("")) 
		para (int j = 1; j <= n; j ++) printf ("% d", a [i] [j] ); 
	devuelve 0; 
}

Supongo que te gusta

Origin www.cnblogs.com/syksykCCC/p/CF1333E.html
Recomendado
Clasificación