Examen de certificación informática CCF 201803-2: análisis de bolas en colisión

bola que choca

tema:

Hay un segmento de línea con longitud L (L es un número par) en el eje numérico, el extremo izquierdo está en el origen y el extremo derecho está en la coordenada L. Hay n bolas pequeñas independientemente del volumen en el segmento de línea. Al principio, todas las bolas pequeñas están en las coordenadas pares, la dirección de la velocidad es a la derecha y la velocidad es de 1 unidad de longitud por segundo.
Cuando la bola alcance el punto final del segmento de línea (punto final izquierdo o punto final derecho), se moverá inmediatamente en la dirección opuesta y la velocidad seguirá siendo del tamaño original.
Cuando dos bolas pequeñas chocan, las dos bolas pequeñas se moverán en la dirección opuesta a su dirección de movimiento original y continuarán moviéndose a la velocidad original.
Ahora, dígale la longitud L del segmento de línea, el número n de bolas pequeñas y las posiciones iniciales de n bolas pequeñas, calcule la posición de cada bola pequeña después de t segundos.

pista:

Debido a que las posiciones iniciales de todas las bolas son pares y la longitud del segmento de línea es par, se puede probar que no habrá tres bolas que chocan al mismo tiempo, y las bolas alcanzan el final del segmento de línea y el el tiempo de colisión entre las bolas es un número entero.
Al mismo tiempo, también se puede probar que la posición donde chocan las dos bolas debe ser un número entero (pero no necesariamente un número par).

Formato de entrada:

La primera línea de entrada contiene tres números enteros n, L, t, separados por espacios, que representan el número de bolas, la longitud del segmento de línea y la posición de la bola después de t segundos que necesita calcular.
La segunda línea contiene n números enteros a1, a2, ..., an, separados por espacios, que indican la posición de n bolitas en el momento inicial.

Formato de salida:

Muestra una línea que contiene n enteros separados por espacios. El i-ésimo entero representa la posición de la pelota en ai en el momento inicial después de t segundos.

Ejemplo de entrada:

3 10 5
4  6 8

Salida de muestra:

7 9 9

Ejemplo de descripción:

Inicialmente, las posiciones de las tres bolas son 4, 6 y 8 respectivamente.
Figura 1
Un segundo después, las posiciones de las tres bolas son 5, 7 y 9 respectivamente.
Figura 2
Dos segundos después, la tercera bola golpea la pared, la velocidad se invierte y las posiciones de las tres bolas son 6, 8 y 10 respectivamente.
imagen 3
Tres segundos después, la segunda bola choca con la tercera bola en la posición 9, la velocidad se invierte (observe que la posición de colisión no es necesariamente un número par) y las posiciones de las tres bolas son 7, 9 y 9 respectivamente.
Figura 4
Cuatro segundos después, la primera bola choca con la segunda bola en la posición 8 y la velocidad se invierte. La tercera bola golpea la pared y la velocidad se invierte. Las posiciones de las tres bolas son 8, 8 y 10 respectivamente. .
Figura 5
Cinco segundos después, las posiciones de las tres bolas son 7, 9 y 9 respectivamente.
Figura 6

Ejemplo de entrada 2:

10 22 30
14 12 16 6 10 2 8 20 18 4

Salida de muestra 2:

6 6 8 2 4 0 4 12 10 2

Tamaño de datos y convenciones:

Para todos los casos de evaluación, 1 ≤ n ≤ 100, 1 ≤ t ≤ 100, 2 ≤ L ≤ 1000, 0 < ai < L. L es un número par.
Asegúrese de que las posiciones iniciales de todas las bolas sean diferentes y uniformes.

el código

#include<cstdio>
#define maxn 1005
struct BALL
{
    
    
	int a;  //坐标
	int direction = 1;   //方向
}ball[maxn];

int toRight(int a)
{
    
    
	return ++a;
}
int toLift(int a)
{
    
    
	return --a;
}

int main()
{
    
    
	int n, L, t;
	scanf("%d%d%d", &n, &L, &t);
	for (int i = 0; i < n ; i++)
	{
    
    
		scanf("%d", &ball[i].a);
	}
	for(int i = 0;i < t; i++)
	{
    
    
		for(int j = 0; j < n ;j++)
		{
    
    
			if (ball[j].direction) ball[j].a = toRight(ball[j].a);
			else ball[j].a = toLift(ball[j].a);
		}
		for (int j = 0; j < n; j++)
		{
    
    
			if (ball[j].a == L) ball[j].direction = !ball[j].direction;  //碰到右边界向左
			if (ball[j].a == 0) ball[j].direction = !ball[j].direction;  //碰到左边界向右
			for (int k = j+1;k < n;k++)                //遍历小球,发现坐标相等记为碰撞将方向置反
			{
    
    
				if (ball[j].a == ball[k].a)
				{
    
    
					ball[j].direction = !ball[j].direction;
					ball[k].direction = !ball[k].direction;
				}
			}

		}
	}
	for (int i = 0; i < n; i++)
	{
    
    
		printf("%d ", ball[i].a);
	}
	return 0;
}

analizar

Se usa un bucle for triple, pero el código sigue siendo fácil de entender.
Primero declare una estructura de bola que contenga dos variables int, a representa las coordenadas y dirección representa la dirección del movimiento de la bola.
Este código calcula las coordenadas de la pelota.

for(int i = 0;i < t; i++)
	{
    
    
		for(int j = 0; j < n ;j++)
		{
    
    
			if (ball[j].direction) ball[j].a = toRight(ball[j].a);
			else ball[j].a = toLift(ball[j].a);
		}
		for (int j = 0; j < n; j++)
		{
    
    
			if (ball[j].a == L) ball[j].direction = !ball[j].direction;  //碰到右边界向左
			if (ball[j].a == 0) ball[j].direction = !ball[j].direction;  //碰到左边界向右
			for (int k = j+1;k < n;k++)                //遍历小球,发现坐标相等记为碰撞将方向置反
			{
    
    
				if (ball[j].a == ball[k].a)
				{
    
    
					ball[j].direction = !ball[j].direction;
					ball[k].direction = !ball[k].direction;
				}
			}

		}
	}

El bucle más externo atraviesa el número de segundos y calcula las coordenadas de la bola pequeña en cada bucle. El primer ciclo en el ciclo for mueve la pelota a la siguiente posición y luego juzga.
El segundo bucle for atraviesa la bola para determinar si la bola está al final del eje de coordenadas y, de ser así, establecer la dirección de la bola en reversa.
El bucle for interior atraviesa la bola a partir de j+1, y si las coordenadas de la bola son iguales a las del bucle exterior, las direcciones de las dos bolas cambian.

Supongo que te gusta

Origin blog.csdn.net/qq_32577169/article/details/100656048
Recomendado
Clasificación