Szybkie pytanie - potrzebna odpowiedź w ciągu godziny

0

Hej, witajcie mam problem ze swoim programem. Teoretycznie wszystko działa pięknie, natomiast program do oceniania zadań zwraca komunikat RV (naruszenie regulaminu). Dzieje się tak m. in. przy zostawiony system("PAUSE"). W tym przypadku nie mam pojęcia o co chodzi, teoretycznie wszystko powinno działać.

Kod programu: http://wklej.eu/index.php?id=ac8da77ece
Treść zadania: http://tnij.org/q0as

Z góry dziękuję za pomoc, potrzebuję odpowiedzi do godz. 12 :(

0

Gdzieś na tym forum powiedziałem:
Programowanie bez formatowania kodu to jak chodzenie ze spodniami spuszczonymi na kostki.
Owszem da się ale bardzo niewygodnie i wygląda nieprzyzwoicie.
Jak masz niesformatowany kod to raczej nikt na szybko ci nie odpowie.
Jak już sformatujesz to sam zauważysz ten błąd.

0

Trochę zmieniłem kod, wklejam go poniżej. Program kompiluje się poprawnie, wszystko działa dobrze tylko automatyczna sprawdzarka online wywala błąd "naruszenie regulaminu". Ma ktoś z was jakiś pomysł? Zostało 30 min.. z góry dziękuję :)

 
#include <cstdlib>
#include <iostream>

using namespace std;

char link[101][101];
char tab2[101];
int sciezka[101];
int tab[101];
int Node,Edge;
int top,back;

void start() {
    int i, j;
    for(i = 1; i <= Node; i++) {
    for(j = 1; j <= Node; j++) {
     link[i][j] = 0;
    }
     sciezka[i] = i;
     tab2[i] = 0;
    }
}

int pop() {
    int n = tab[top++];
    top %= 101;
    return n;
}

void drukuj(int n) {
    if(n == sciezka[n]) {
     cout << n;
      return;
    }
     drukuj(sciezka[n]);
      cout << " " << n;
}

void wstaw(int n) {
    tab[back++] = n;
    back %= 101;
}

bool czyPusta() {
    if(top == back) return 0;
    return 1;
}

void BFS(int s, int ter) {
    int u, v, i;
    wstaw(s);
    tab2[s] = 1;
    while(czyPusta() == 1) {
        v = pop();
        if(v == ter) {
            drukuj(v);
            return;
        }
        
        for(i = 1; i<= Node; i++) {
            if(link[v][i] == 1 && tab2[i] == 0)  {
                tab2[i] = 1;
                wstaw(i);
                sciezka[i] = v;
            }
        }
    }
    cout << "nie ma drogi";
    return;
}

int main() {
    int v, s, i;
    
    cin >> Node;
    cin >> Edge;
    
    start();
    
    for(int i=0; i<Edge; i++) {
        cin >> s >> v;
        link[s][v] = 1;
        link[v][s] = 1;
    }  
    cin >> s >> v;  
    
    BFS(s,v);
    
    return 0;
}

E: jeśli program by zwracał złe dane to bym dostał komunikat Wrong answer. Niestety program wysypuje się gdzieś wcześniej, z kolei jak to kompiluję u siebie to wszystko działa okej.. nic z tego nie rozumiem

0

Kolego naucz się formatować kod po bożemu.
Masz brak inicjalizacji top i back.

0

inicjalizacja top i back jest w 11 lini (zmienne globalne). Program kompiluje się poprawnie, zdaje się że działa. Właśnie dlatego nie wiem w czym problem.

0

Nie inicjalizujesz zmiennych, używasz indeksacji od 1 mimo że powiedziano że numeracja węzłów jest od zera, ja bym się nie dziwił takim kwiatkom.

0

indeksy poprawiłem, ale jak to nie inicjalizuje? Przecież jakby tak było, to by kompilator mi nie przepuścił programu, a program się kompiluje. Część zmiennych jest zainicjowana jako zmienne globalne.

0

poprawiłem indexy, kod wygląda następująco (program ogólnie działa, nie wiem w którym momencie występuje bład):

#include <cstdlib>
#include <iostream>

using namespace std;

char link[101][101];
char tab2[101];
int sciezka[101];
int tab[101];
int Node,Edge;
int top,back;

void start() {
    int i, j,top,back;
    for(i = 0; i < Node; i++) {
        for(j = 0; j < Node; j++) {
         link[i][j] = 0;
        }
        sciezka[i] = i;
        tab2[i] = 0;
    }
}

int pop() {
    int n = tab[top++];
    top %= 101;
    return n;
}

void drukuj(int n) {
    if(n == sciezka[n]) {
     cout << n;
     return;
    }
     drukuj(sciezka[n]);
     cout << " " << n;
}

void wstaw(int n) {
    tab[back++] = n;
    back %= 101;
}

bool czyPusta() {
    if(top == back) return 0;
    return 1;
}

void BFS(int s, int ter) {
    int u, v, i;
    wstaw(s);
    tab2[s] = 1;
    while(czyPusta() == 1) {
        v = pop();
        if(v == ter) {
            drukuj(v);
            return;
        }
        
        for(i = 0; i< Node; i++) {
            if(link[v][i] == 1 && tab2[i] == 0)  {
                tab2[i] = 1;
                wstaw(i);
                sciezka[i] = v;
            }
        }
    }
    cout << "nie ma drogi";
    return;
}

int main() {
    int v, s, i;
    
    cin >> Node;
    cin >> Edge;
    
    start();
    
    for(int i=0; i<Edge; i++) {
        cin >> s >> v;
        link[s][v] = 1;
        link[v][s] = 1;
    }  
    cin >> s >> v;  
    
    BFS(s,v);
    
    return 0;
}

0

czy odróżniasz inicjalizacje od deklaracji ?
nie:

int i, j,top,back; 

tylko:int i, j;
top=back=0;

0

hmm no fakt, inicjalizacja to też nadanie wartości.

E: niestety efekt dalej ten sam.

0

no fakt, w sumie to o tym wiedziałem jeszcze z LO. No ale program niestety nadal nie działa.. kompiluje się dobrze, daje dobre wyniki, a jednak dostaję komunikat błędu jak wysyłam źródło na ten onlinowy test..

0

To może być jeszcze kwestia przepelnienia stosu przy długości maksymalnej ścieżki.

1

Zmienne globalne nie wymagają inicializacji. top i back będą równe 0.

0

hmm wydaje mi się, że za któryś test dostałbym jakieś punkty, a na inne byłaby wrong answer. Tymczasem na start dostaję komunikat "Naruszenie regulaminu". Ten komunikat dostawałem jak zostawiałem system pause.

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