Błąd "illegal syscall"

0

Witam. Sprawdzarka themis.lo14.wroc.pl wyrzuca mi błąd "illegal syscall". Niestety nie wiem czemu ten błąd następuję. Tutaj jest treść mojego zadania: > Hieronim strasznie lubi bawić się wieżami Hanoi. Wieże Hanoi to trzy pręty, na jednym z nich znajduje się h krążków różnych rozmiarów, poukładanych od największego (h-tego) na dole do najmniejszego (pierwszego) na górze. Krążki można przekładać po jednym na raz, krążka większego nie można położyć na mniejszym. Hieronim potrzebuje programu, który sprawdzi, czy sekwencja ruchów, którą chce wykonać, jest zgodna z powyższymi regułami.
Wejście

Pierwsza linia wejścia zawiera liczbę h - jest to ilość krążków. Na początku wszystkie krążki znajdują się na pierwszym pręcie. Następnie dana jest liczba n - jest to ilość ruchów, którą chce wykonać Hieronim. Następnie danych jest n liczb, które oznaczają, że Hieronim chce przenieść krążek z pręta:
1 - pierwszego pręta na drugi
2 - pierwszego na trzeci
3 - drugiego na trzeci
4 - drugiego na pierwszy
5 - trzeciego na pierwszy
6 - trzeciego na drugi
Wyjście

Jeżeli sekwencja ruchów, którą chce wykonać Hieronim jest poprawna, należy wypisać DOBRZE. W przeciwnym wypadku należy wypisać ZLE.>

A tutaj mój program:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int ilosc_krazkow, ilosc_ruchow, ruch,x;
    bool dobrze=true;
    vector<int> p1, p2, p3;
    cin>>ilosc_krazkow>>ilosc_ruchow;
    p1.reserve(ilosc_krazkow);
    p2.reserve(ilosc_krazkow);
    p3.reserve(ilosc_krazkow);
    for(int i=1; i<=ilosc_ruchow; i++)
    {
        cin>>x;
        for(int k=ilosc_krazkow; k>=1; k--)
        {
            p1.push_back(k);
        }
       if(x==1 && p1.size()==0)
       dobrze=false;
       else if(x==1)
       {
           p2.push_back(p1[p1.size()-1]);
           p1.pop_back();
       }
       if(x==2 && p1.size()==0)
       dobrze=false;
       else if(x==2)
       {
           p3.push_back(p1[p1.size()-1]);
           p1.pop_back();
       }
       if(x==3 && p2.size()==0)
       dobrze=false;
       else if(x==3)
       {
           p3.push_back(p2[p2.size()-1]);
           p2.pop_back();
       }
       if(x==4 && p2.size()==0)
       dobrze=false;
       else if(x==4)
       {
           p1.push_back(p2[p2.size()-1]);
           p2.pop_back();
       }
       if(x==5 && p3.size()==0)
       dobrze=false;
       else if(x==5)
       {
           p1.push_back(p3[p3.size()-1]);
           p3.pop_back();
       }
       if(x==6 && p3.size()==0)
       dobrze=false;
       else if(x==6)
       {
           p2.push_back(p3[p3.size()-1]);
           p3.pop_back();
       }
       if(p1.size()>1)
       {
       if(p1[p1.size()-1]>p1[p1.size()-2])
       dobrze=false;
       }
       if(p2.size()>1)
       {
       if(p2[p2.size()-1]>p2[p2.size()-2])
       dobrze=false;
       }
       if(p3.size()>1)
       {
       if(p3[p3.size()-1]>p3[p3.size()-2])
       dobrze=false;
       }
    }
    if(dobrze==true)
    cout<<"DOBRZE";
    else
    cout<<"ZLE";
  return 0;
}

Niestety nie udało mi się wpaść, na jakiś inny sposób. Sam program działa u mnie poprawnie. Z góry dziękuję za pomoc

0

EDIT: Bzdury, post niżej wszystko wyjaśnia.

Illegal syscall?

Wyznaję, że nie rozumiem?

AFAIK taki błąd to zwykle zabezpiecznie przed próbami hackowania sprawdzarki, np. wyskakuje gdybyś jakieś pliki próbował otwierać albo coś. Ale nic takiego nie robisz przecież.

Jeśli jesteś uczniem tego liceum, to nie wiem, pokaż może ten kod osobie odpowiedzialnej u was za sprawdzarkę, bo jakby coś było nie tak z nią?

Oprócz tego jedyne inne wyjście, jakie na razie widzę, to to, że sprawdzarka zabrania dynamicznej alokacji pamięci (z przyczyn niewiadomych) i w związku z tym nie wolno używać vector a jedynie czystych C-owskich tablic, i to alokowanych statycznie - czyli nie

vector<int> p1;
p1.reserve(ilosc_krazkow);

tylko:

int ilosc_krazkow;
scanf("%d", &ilosc_krazkow);
int p1[ilosc_krazkow];

Język C (ale nie C++) pozwala na taką konstrukcję. W praktyce można używać tego i w C++ na kompilatorze gcc, (nie wiem, jak clang), którego prawdopodobnie używasz o ile nie siedzisz na Visual Studio.

Ale czemu by sprawdzarka miała taką restrykcję wprowadzać, nie wiem. Myślę też, że gdyby była wprowadzona, to byś miał to wyraźnie powiedziane.

CHyba że jestem ślepy i czegoś nie widzę.

2

zapychasz p1 za duża ilością krążków bo masz błąd logiczny, wepchnąłeś inicjalizację do pętli.
Po prostu przekraczasz limit pamięci.

0

Przyznam, że nie rozumiem. Jak mogę to naprawić?

1 użytkowników online, w tym zalogowanych: 0, gości: 1