Registro de preguntas del DO: Pregunta A: Copa Blue Bridge (Grupo C / C ++) 2015-8 Distancia de movimiento

Pregunta A: Blue Bridge Cup (grupo C / C ++) 2015-8 distancia de movimiento

Requisitos del tema:
Los edificios de la comunidad residencial del Planeta X son todos iguales y están dispuestos en un patrón de matriz. El número de edificios es 1, 2, 3 ...
Cuando una fila está llena, los números están dispuestos en la dirección opuesta a los edificios adyacentes en la siguiente fila.
Por ejemplo: cuando el ancho de numeración de la celda es 6, la situación inicial es la siguiente:

1 2 3 4 5 6
12 11 10 9 8 7
13 14 15…

Nuestro problema es: se conocen dos números de edificio myn, y es necesario encontrar la distancia de movimiento más corta entre ellos (no se puede mover en diagonal)

Entrada La
entrada es de 3 enteros wmn, separados por espacios, todos dentro del rango de 1 a 10000.
w es el ancho del número de fila y myn son los números de edificio que se calcularán.
Salida Se
requiere generar un número entero, que representa la distancia de movimiento más corta entre mn dos pisos.

Entrada de muestra Copia
6 8 2
Salida de muestra Copia
4

Idea
para la resolución de problemas: Según la descripción del problema, podemos ver que los barrios residenciales del planeta X están dispuestos en una matriz con w como columna, y se requiere el camino más corto entre los dos edificios, es decir, el camino más corto entre dos puntos de la matriz y la matriz. La suma de la longitud y el ancho del rectángulo encerrado por los dos puntos es el camino más corto entre los dos puntos. Cuando la posición de los dos puntos es incierta, tomamos el valor absoluto de la diferencia entre las coordenadas horizontal y vertical de los dos puntos y los sumamos , Es el camino más corto entre dos puntos.
El punto clave de esta pregunta radica en las filas pares de la matriz (asumiendo que el subíndice de la primera fila de la matriz es 1). De acuerdo con los requisitos de la pregunta, el orden de las filas pares de la matriz es el inverso del orden numérico normal. Necesitamos hacer otro juicio y conversión al tomar la coordenada y de la columna.

El siguiente código es un poco detallado y se puede escribir de forma más concisa.

Código de despacho de aduana:

#include <iostream>
#include <algorithm>

using namespace std;

struct Pos {
    
    
	int _x;
	int _y;
	Pos(int x, int y):_x(x), _y(y) {
    
    }
};

Pos getPos(int w, int num) {
    
    
	int x, y;
	
	if (num % w == 0) {
    
    
		x = num / w;
	} else {
    
    
		x = (num + w) / w;
	}
	
	if (x % 2 == 0) {
    
    
		y = w - (num % w) + 1;
	} else {
    
    
		y = num % w ? num % w : w;
	}
	
	return Pos(x, y);
}

int main() {
    
    
	int w, m, n, res;
	
	cin >> w >> m >> n;
	
	Pos M = getPos(w, m);
	Pos N = getPos(w, n);
	
	res = abs(M._x - N._x) + abs(M._y - N._y);
	
	cout << res;
	
	return 0;
}

completar.

Supongo que te gusta

Origin blog.csdn.net/weixin_45711556/article/details/108956766
Recomendado
Clasificación