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

SkarbFinder zadanie SPOJ C++

Object Storage Arubacloud
+2 głosów
1,187 wizyt
pytanie zadane 26 lutego 2016 w C i C++ przez niezalogowany

Chodzi o zadanie z spoja. Skatb finder --->

Moj kod jest dlugi i wiem że dało sie to ładniej ułożyć.

Generalnie dzieli sie on na 2 czesci. Pierwsza ktora jest raczej dobra to znajdowanie miejsca docelowego po wspolrzednych. 2 to wyznaczasnie trasy. i z nia mam problem. zaloczylem że mam sie poryszac cały czas na skos czyli np gora prawo... lub dol lewo... itp. do momentu gdzie albo moje x nie bedzie rowne x celu albo moje y == y celu. i wtedy juz daje jedna komende do jakby dojscia bo to juz ta ostatnia prosta. Mam swiadomosc ze ta 2 czesc jest dosc prymitywnie zrobiona. Jesli macie jakas podpowiedz jak to zrobic szybko i elegancko to poprosze. jesli nie to prosze o pomoc z moim kodem. OTO ON:

#include <iostream>

using namespace std;

void kierunek(int &x,int &y,int w,int l)
{
    switch (w)
    {
case 0:
    y+=l;
    break;
    case 1:
    y-=l;
    break;
    case 2:
    x-=l;
    break;
    case 3:
    x+=l;
    break;

    }

}

int x,y,w,l,vy,vx;
int main()
{
    x=0;
    y=0;
    int t,k;
    cin>>t;
    for(int i=0;i<t;i++)
    {
        x=0;
        y=0;
        cin>>k;
        for(int j =0;j<k;j++)
        {
            cin>>w;
            cin>>l;
            kierunek(x,y,w,l);



        }
        if(x==0 && y==0) cout<<"studnia"<<endl;
        else{
            vy=0;vx=0;
            while(vx!=x||vy!=y)
            {
                if(vy!=y && vx!=x){
                    if(vy<y) {
                   vy++;
                        cout<<0<<" "<<1<<endl;
                }

                 if(vy>y) {
                    vy--;
                        cout<<1<<" "<<1<<endl;
                }

                if(vx>x){
                   vx--;
                        cout<<2<<" "<<1<<endl;
                }
                 if(vx<x){
                    vx++;
                        cout<<3<<" "<<1<<endl;
                }



                }
                else {

                    if(vx==x){

                        if(y>vy)
                        {
                            cout<<0<<" "<<y-vy;
                            vy+=(y-vy);
                        }
                    else{

                     cout<<1<<" "<<vy-y;
                     vy-=(y-vy);
                    }
                    }else {
                    if(x>vx)
                    {
                        cout<<3<<" "<<x-vx;
                        vx+=(x-vx);
                    }

                    else
                    {
                        cout<<2<<" "<<vx-x;
                        vy-=(x-vx);
                    }


                    }

                }


            }



        }






    }
    return 0;
}

 

 

PS. vx to "moje" x  a vy to moje "y"

x to x celu a y to y celu.

Dzieki za każdą pomoc

1 odpowiedź

+1 głos
odpowiedź 26 lutego 2016 przez k222 Nałogowiec (30,150 p.)
edycja 26 lutego 2016 przez k222

Zmieniłem troszkę twój program i teraz powinno być ok:

#include <iostream>

using namespace std;

void kierunek(int &x,int &y,int w,int l)
{
    switch (w)
    {
    case 0:
        y+=l;
        break;
    case 1:
        y-=l;
        break;
    case 2:
        x-=l;
        break;
    case 3:
        x+=l;
        break;

    }

}

int main()
{
    int t,k, x,y,w,l;
    cin>>t;
    for(int i=0; i<t; i++)
    {
        x=0;
        y=0;
        cin>>k;
        for(int j =0; j<k; j++)
        {
            cin>>w;
            cin>>l;
            kierunek(x,y,w,l);



        }
        if(x==0 && y==0) cout<<"studnia"<<endl;
        else
        {
            if(y != 0)
            {
                if(y >= 0)
                    cout<<"0 "<<y<<endl;
                else
                    cout<<"1 "<<-y<<endl;
            }
            if(x != 0)
            {
                if(x >= 0)
                    cout<<"3 "<<x<<endl;
                else
                    cout<<"2 "<<-x<<endl;
            }
        }
    }
    return 0;
}

i tutaj mniej lub bardziej ważne uwagi

*int x,y,w,l,vy,vx - te zmienne nie muszą być globalne bo w funkcji masz już określone typy (int &x,int &y,int w,int l) więc jak coś nie musi być globalne to nie powinno bo najwyżej mogą być z tego problemy,

*2 razy ustawiasz x i y na 0 - raz wystarczy ;)

*zmienne vx i vy nie są ci do niczego potrzebne bo zauważ, że po pętli for z funkcją gdzie są podawane kolejne dane masz ustawione zmienne x i y na współrzędne celu a studnie na 0 0, więc najprostszą  drogą jest sprawdzenie czy ma się na wschód, zachód, północ czy południe o ile i tutaj natrafiamy na zmienioną drugą część programu bo o ile podają ci zmienne x i y, a kierunek ustala ich znak ( y < 0 południe y > 0 północ ...)i tak też to zrobiłem

* a i jeszcze zauważ, jak wpiszesz do twojego programu dane

1

2

0 10

3 10

to będzie on szedł schodkowo do punktu docelowego (wpisz to będziesz wiedział o co mi chodzi), a moja wersja pokaże 0 10

3 10

czyli dwa proste odcinki, droga ta sama, ale nie wiem jak na takie coś zareaguje spoj

Podobne pytania

0 głosów
1 odpowiedź 350 wizyt
pytanie zadane 29 sierpnia 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)
0 głosów
1 odpowiedź 588 wizyt
pytanie zadane 26 lipca 2016 w C i C++ przez am49 Początkujący (420 p.)
0 głosów
1 odpowiedź 351 wizyt
pytanie zadane 18 lutego 2017 w C i C++ przez MyWash Bywalec (2,640 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...