Witam mam problem z zadankiem.
Jest sobie uklad wspolrzednych po ktorym bedzie poruszal sie robot.
Zaczyna z punktu (0,0) skierowany na północ.
Robota programuje się, podając mu ciąg komend: rusz sie o tyle jednostek a następnie obróć o 90◦ w prawo.(przykładowe wejscie):
4 28 (n - ilosc ruchow i t - ilosc czasu)
2 3 1 2 (ciag n cyfr oznaczjacy o ile jednostek ma sie ruszyć robot)
3 2 (jesli robot znajdzie sie w tym miejscu lub przez nie przjedzie to mam dodac do wyniku 1)
Robot ma baterię która starczy mu na t sekund działania, przejechanie jednej jednostki odległości, jak i jeden obrót o 90◦ trwa jedną sekundę. Wynikiem powinno byc to ile razy robocik znajdzie się w ustalonym punkcie (x, y) - tutaj 3 2 w przykladzie.
Pierwze na co wpadłem to symulacja i sprawdzenie czy robocik przeszedl przez punkt lub sie na nim znajduje ale okazuje sie ze nie w kazdym przypadku jest to dobre rozwiazanie (mój kod i obrazek do zadania ponizej):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll M = 100001;
ll n,t;
pair<ll,ll> poz;
pair<ll,ll> xy;
ll tab[M];
ll wyn;
ll licznik;
ll od1do4=1;
bool bylo=false;
bool czy(ll ax,ll ay,ll bx,ll by,ll x,ll y)
{
ll det=ax*by+bx*y+x*ay-x*by-ax*y-bx*ay;
if(det!=0) return false;
if ((min(ax,bx)<=x)&&(x<=max(ax,bx)) && (min(ay,by)<=y)&&(y<=max(ay,by)))
return true;
else return false;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> t;
for(ll i=0; i<n; i++)
{
cin >> tab[i];
}
poz.first=0;
poz.second=0;
cin >> xy.first >> xy.second;
ll i = 0;
if(0 == xy.first && 0 == xy.second) wyn++;
while(licznik <= t)
{
tab[i] = ((tab[i]-1) % n)+1;
if(licznik+tab[i] > t)
tab[i]-=tab[i]-(t-licznik);
if(od1do4 == 1)
poz.second+=tab[i];
else if(od1do4 == 2)
poz.first+=tab[i];
else if(od1do4 == 3)
poz.second-=tab[i];
else if(od1do4 == 4)
poz.first-=tab[i];
if(bylo == false)
{
if(od1do4 == 1){
if(czy(poz.first, poz.second-tab[i], poz.first, poz.second, xy.first, xy.second)) {wyn++;}}
else if(od1do4 == 2){
if(czy(poz.first-tab[i], poz.second, poz.first, poz.second, xy.first, xy.second)) {wyn++;}}
else if(od1do4 == 3){
if(czy(poz.first, poz.second+tab[i], poz.first, poz.second, xy.first, xy.second)) {wyn++;}}
else if(od1do4 == 4){
if(czy(poz.first+tab[i], poz.second, poz.first, poz.second, xy.first, xy.second)) {wyn++;}}
}
bylo=false;
if(poz.first == xy.first && poz.second == xy.second) {bylo=true;}
if(i+1==n)
i=-1;
if(od1do4 == 4)
od1do4=0;
od1do4++;
licznik+=tab[i]+1;
i++;
}
cout << wyn;
return 0;
}
Dziala on tak ze funkcja "czy" sprawdza czy punkt nalezy do odcinka przed ruchem robota i po ruchu (latwo to zauwazyc. W moim kodzie jest troche takie if'ologii bo jest tu duzo szczegolow (w tym zad)...
Pozdrawiam i dzieki z góry za pomoc ;)