• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Robot c++ zadanie

Object Storage Arubacloud
–1 głos
1,878 wizyt
pytanie zadane 14 października 2018 w C i C++ przez jjanickij Użytkownik (510 p.)

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 ;)

komentarz 14 października 2018 przez mokrowski Mędrzec (155,460 p.)

Witam mam problem z zadankiem.

Jaki dokładnie masz problem i czego oczekujesz?

komentarz 14 października 2018 przez jjanickij Użytkownik (510 p.)
Chodzi o to ze na dole posta opsialem jak dziala moj kod w skrocie ale w sprawdzarce dziala tylko dla dwoch przykladow.

Licze na pomysl z jakims szybszym rozwiazaniem bo mam limity czasowe ;(

1 odpowiedź

0 głosów
odpowiedź 14 października 2018 przez Sanchezklub Początkujący (400 p.)
Brzmi jak olimpiada informatyczna :)
komentarz 14 października 2018 przez jjanickij Użytkownik (510 p.)
Chodz poprostu o jakiegos hinta, bo nie wiem co moge miec zlego w moim pomysle ;/

Podobne pytania

+1 głos
1 odpowiedź 177 wizyt
pytanie zadane 2 grudnia 2022 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)
+1 głos
4 odpowiedzi 494 wizyt
+4 głosów
0 odpowiedzi 191 wizyt
pytanie zadane 10 grudnia 2021 w Offtop przez wojtek_suchy Mądrala (6,880 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,965 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...