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

Robot c++ zadanie

VPS Starter Arubacloud
–1 głos
1,865 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ź 159 wizyt
pytanie zadane 2 grudnia 2022 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)
+1 głos
4 odpowiedzi 462 wizyt
+4 głosów
0 odpowiedzi 187 wizyt
pytanie zadane 10 grudnia 2021 w Offtop przez wojtek_suchy Mądrala (6,880 p.)

92,453 zapytań

141,262 odpowiedzi

319,087 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...