Witam, już od paru dni męczę się z pewnym zadaniem, i nie mogę wychwycić gdzie mam błąd, ponieważ program typu SPOJ nie chce mi go zaakceptować, dlatego zwracam się tu o pomoc, z góry dziękuje ! :)
Robot porusza się na płaszczyźnie wzdłuż łamanej złożonej z odcinków. Obecnie przemieszcza się z punktu A0 do punktu A1. Następnie odwiedzi punkty A2, A3, ..., An. Oblicz, w którą stronę robot powinien skręcać oraz wartość cosinusa kąta skrętu dla każdego z punktów A1, A2, ..., An-1.
Wejście
W pierwszej linii jedna liczba 2<=n<=1000, a w kolejnych n+1 liniach po dwie liczby całkowite:
xi yi
z przedziału [-1000..1000] będące współrzędnymi kolejnych punktów marszruty robota.
Można założyć, że kolejne punkty są różne.
Wyjście
W kolejnych n-1 liniach najpierw litera L dla skrętu w lewo (R dla skrętu w prawo), odstęp, a następnie cosinus kąta skrętu z dokładnością do 6 miejsc dziesiętnych po kropce. Jeśli w danym punkcie robot pownien poruszać się prosto należy wydrukować tylko literę F, a jeśli do tyłu, to literę B.
Przykład
Wejście:
5
0 0
1 0
2 0
-2 0
-2 -2
0 4
Wyjście:
F
B
L 0.000000
L -0.948683
A tu mój kod:
#include <iostream>
#include <cmath>
int main()
{
std::cout.precision(6);
std::cout.setf(std::ios::fixed);
int n;
std::cin >> n;
int tabx[n + 1], taby[n + 1];
for (int j = 0; j <= n; j++) // wprowadzanie danych
{
std::cin >> tabx[j];
std::cin >> taby[j];
}
for (int i = 1; i < n; i++) {
long int ax, ay, bx, by, w, w1;
ax = tabx[i] - tabx[i - 1];
ay = taby[i] - taby[i - 1]; // wektor pierwszy
bx = tabx[i + 1] - tabx[i];
by = taby[i + 1] - taby[i]; // wektor drugi
//obliczanie wyznacznika ruchu
w = (ax * by) - (ay * bx);
//obliczanie cosinusa
w1 = (ax * bx) + (ay * by);
long double w2 = sqrt(ax * ax + ay * ay),
w3 = sqrt(bx * bx + by * by);
long double kat = (double)w1 / (w2 * w3);
if (w == 0) // gdy sa rownoglegle
{
if (kat == 1) // gdy cosinus rowna sie 0 stopni
std::cout << "F" << std::endl;
else if (kat == -1) // gdy rowna sie 180 stopni
std::cout << "B" << std::endl;
}
else {
if (w > 0) //skret w lewo
std::cout << "L " << kat << std::endl;
else // skret w prawo
std::cout << "P " << kat << std::endl;
}
}
return 0;
}