Witam, dostałem do napisania algorytm, dokładna treść zadania tu: http://wklej.org/id/1872313/txt/
Dla wszystkich przykładowych danych z treści zadania mój program działa dobrze. Niestety sprawdzany jest na platformie à la spoj, gdzie przechodzi tylko jeden test - zwrócenie wyniku -1 w wypadku braku danych...
Danych testowych oczywiście nie znam, w związku z czym nie mogę znaleźć błędu w moim programie. Mógłbym liczyć na pomoc w znalezieniu błędu w moim rozumowaniu?
Poniżej kod:
#include <stdio.h>
#include <stdlib.h>
#define gc getchar
struct Elem;
Elem* tmp;
Elem* tmp2;
int dlugosc=0;
int lim;
struct Elem {
Elem* p;
Elem* n;
int x;
Elem (int c){
p = NULL;
n = NULL;
x = c;
}
void R(){
tmp2 = tmp->n->n;
lim = tmp->n->x;
delete tmp->n;
dlugosc--;
tmp->n=tmp2;
for (int i=0; i<lim; i++) tmp=tmp->n;
}
void X(){
tmp2 = tmp->n;
tmp->n = new Elem((tmp->x)-1);
tmp->n->n=tmp2;
dlugosc++;
lim = tmp->x;
for (int i=0; i<lim; i++) tmp=tmp->n;
}
};
void scan_integer( int* o ){
register int c = gc();
if (c!=EOF){
int x = 0;
for( ; ((c<48 || c>57)); c = gc() );
for( ;c>47 && c<58; c = gc() ) {
x = (x << 1) + (x << 3) + c - 48;
}
*o = x;
}else *o=EOF;
}
int main()
{
int t;
int c;
scan_integer(&t);
if (t==EOF){printf("%d", -1); return 0;}
scan_integer(&c);
if (c==EOF){printf("%d", -1); return 0;}
Elem * pierwszy = new Elem(c);
dlugosc++;
scan_integer(&c);
tmp = pierwszy;
while(c != EOF){
tmp->n=new Elem(c);
tmp->n->p = tmp;
tmp = tmp->n;
dlugosc++;
scan_integer(&c);
}
tmp->n=pierwszy;
tmp = pierwszy;
for(int i=0; i<t; i++){
if (tmp->x % 2 == 0) tmp->R();
else tmp-> X();
}
for (int i=0; i<dlugosc; i++){
printf("%d ", tmp->x);
tmp = tmp->n;
}
return 0;
}
Wczytywanie nastawione na szybkość, działa chyba dobrze. Kwestia pojemności intów chyba też nie ma tu znaczenia, bo nawet zmiana każdego inta w programie na long long inta nie zmienia wyniku, także błąd jest chyba gdzieś w samym algorytmie (operacje R, X i ich wywołanie?)
Program pisałem również z użyciem vectora, niestety z identycznym skutkiem, a tak powinno chyba być szybciej.
Z góry dziękuję za wszelkie wskazówki.