El billar francès o carambola és una de les modalitats de jocs de billar existents. En aquest exercici volem resoldre una versió simplificada d’aquest joc. Tenim un jugador i dues boles (blanca i vermella) sobre un tauler entapissat que no té forats a les cantonades. Es col.loca la bola vermella al tauler sense que toqui cap banda, i la bola blanca a una de les quatre cantonades (vegeu figura).
La bola blanca inicia el recorregut per la diagonal y rebota (seguint l’altre diagonal) quan topa amb una banda. Si arriba a una cantonada (on només hi ha una diagonal) s’atura.
Per a la simulació assumiren que tenim un tauler de dimensions n× m i que el recorregut de la bola blanca acaba quan:
El jugador fa carambola si el recorregut de la bola blanca acaba topant amb la bola vermella després d’haver tocat exactament tres bandes.
Feu un programa que llegeixi la configuració d’un tauler de billar francès i determini si el jugador fa o no carambola. El programa també ha d’enumerar les posicions on la bola xoca amb les bandes del tauler i mostrar-ne la configuració final.
El vostre programa ha de fer servir les següents definicions:
typedef vector< vector <char> > Tauler;
struct Bola {
int x_ant, y_ant; // Posicio anterior de la bola
int x_act, y_act; // Posicio actual de la bola
int x_seg, y_seg; // Posicio seguent de la bola
};
i també ha de definir, implementar i utilitzar la funció:
void moure_fins_xocar (Tauler& t, Bola& b);
que, donat un tauler t i la bola blanca b, mou la bola b dins de t en la direcció i sentit definits per la seva posició actual i següent. La bola s’ha de moure fins a topar amb la bola vermella (si ho fa) o fins arribar a una banda o cantonada. Quan acaba l’execució de la funció, b ha de tenir com a posició actual la posició on s’atura la bola, i les posicions prèvia i següent correctes.
Cal tenir en compte que, quan la bola s’atura a una cantonada, la posició següent és la mateixa posició que l’actual. A més les posicions recorregudes per la bola han de quedar marcades a t.
Entrada
L’entrada consisteix en diverses descripcions inicials de taulers de billar francès. Cadascuna està formada per dos enters n, m ≥ 2 que indiquen el nombre de files i col.lumnes de la matriu que representa el tauler, respectivament. A continuació ve una seqüència de quatre enters x1, y1, x2, y2 que descriuen les posicions inicials (x1, y1) i (x2, y2) de les dues boles.
La bola a la posicio (x1, y1) és la bola blanca i sempre està col.locada a una de les cantonades del tauler (és a dir, a les posicions (0,0),
(0, m − 1), (n − 1, 0) o (n − 1, m − 1)). La bola a la posició (x2,y2) és la bola vermella i sempre està col.locada a la part interior del tauler, sense tocar les bandes (és a dir, 0<x2<n−1 i 0<y2<m−1).
Sortida
Per a cada tauler d’entrada, escriviu les coordenades de les posicions on la bola blanca topa amb les bandes del tauler. Indiqueu també si fa carambola o no i mostreu-ne la trajectòria descrita. Seguiu el format especificat als exemples.
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...=.. ...=.......=... ..=.......=.... .=.......=..... =.......=...... .=.....=....... ..=...=........ ...=.=......... ....=..........