El billar francés o carambola es una de las modalidades de juegos de billar existentes. En este ejercicio queremos simular una versión simple de este juego.
Tenemos un jugador y dos bolas (blanca y roja) sobre un tablero tapizado que no tiene agujeros en las esquinas. Se coloca la bola roja en el tablero sin que toque ninguna banda, y la bola blanca en una de las cuatro esquinas (mirad la figura).
La bola blanca inicia el recorrido por la diagonal y rebota (siguiendo la otra diagonal) cuando choca con una banda. Si llega a una esquina (donde solo hay una diagonal) se para.
Para la simulación asumiremos que tenemos un tablero de dimensiones n× m y que el recorrido de la bola blanca acaba cuando:
El jugador hace carambola si el recorrido de la bola blanca acaba encontrando la bola roja después de haber tocado exactamente tres bandas.
Haced un programa que lea la configuración de un tablero de billar francés y determine si el jugador hace o no carambola. El programa también ha de enumerar las posiciones en que la bola choca con las bandas del tablero y mostrar la configuración final.
Vuestro programa ha de utilizar las siguientes definiciones:
typedef vector< vector <char> > Tablero;
struct Bola {
int x_ant, y_ant; // Posicion anterior de la bola
int x_act, y_act; // Posicion actual de la bola
int x_sig, y_sig; // Posicion siguiente de la bola
};
y también ha de definir, implementar y utilizar la función:
void mover_hasta_chocar (Tablero& t, Bola& b);
que, dados un tablero t y la bola blanca b, mueve la bola b sobre t en la dirección y sentido definidos por su posición actual y siguiente. La bola se ha de mover hasta chocar con la bola roja (si lo hace) o hasta chocar con una banda o esquina. Cuando acaba la ejecución de la función, b ha de tener como posición actual la posición donde se para, y la posición previa y siguiente han de ser las correctas.
Hay que tener en cuenta que, cuando la bola se mueve a una esquina, la posición siguiente ha de ser la misma que la posición actual puesto que la bola no saldrá de esta posición. Además, las posiciones recorridas por la bola han de quedar marcadas en t.
Entrada
La entrada consiste en diversas descripciones iniciales de tableros de billar francés. Cada una está formada por dos enteros n, m ≥ 2 que indican el número de files i columnas de la matriz que representa el tablero, respectivamente. A continuación viene una secuencia de cuatro enteros x1, y1, x2, y2 que describen las posiciones iniciales (x1, y1) y (x2, y2) de las dos bolas.
La bola en la posición (x1, y1) es la bola blanca y siempre está colocada en una de las esquinas del tablero (es decir, en las posiciones (0,0),
(0, m − 1), (n − 1, 0) o (n − 1, m − 1)). La bola en la posición (x2,y2) es la bola roja y siempre está colocada en la parte interior del tablero, sin tocar las bandas (es decir, 0<x2<n−1 y 0<y2<m−1).
Salida
Para cada tablero de entrada, escribid las coordenadea de las posiciones donde la bola jugadora choca con las bandas del tablero. Indicad también si hace carambola o no y mostrad la trayectoria descrita. Seguid el formato especificado en los ejemplos.
Input
4 4 0 0 1 2 6 15 5 14 2 11 10 15 0 0 1 4 11 15 0 14 2 8
Output
: no =... .=b. ..=. ...B : no ............... ............... ...........B... ............=.. .............=. ..............= (9,9)(4,14)(0,10)(9,1): no =.........=.... .=..b....=.=... ..=.....=...=.. ...=...=.....=. ....=.=.......= .....=.......=. ....=.=.....=.. ...=...=...=... ..=.....=.=.... .B.......=..... (10,4)(6,0)(0,6): si ......=.......= .....=.=.....=. ....=...B...=.. ...=.......=... ..=.......=.... .=.......=..... =.......=...... .=.....=....... ..=...=........ ...=.=......... ....=..........