Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.72 KB | None | 0 0
  1. /*************************************************************************}
  2. {* *}
  3. {* XIV OI *}
  4. {* *}
  5. {* Zadanie: Klocki (KLO) *}
  6. {* Plik: klochk.cpp *}
  7. {* Autor: Pawel Parys *}
  8. {* Opis: Program weryfikujacy poprawnosc wyjscia wygenerowanego *}
  9. {* przez program zawodnika, format: *}
  10. {* ./skachk.e in out_zawodnika out_wzorcowy *}
  11. {* *}
  12. {*************************************************************************/
  13. #include <cstdio>
  14. #include <cctype>
  15. #include <cstdlib>
  16. #include <cstring>
  17. #include <algorithm>
  18.  
  19. #define REP(a,n) for (int a=0; a<(n); ++a)
  20. #define FOR(a,b,c) for (int a=(b); a<=(c); ++a)
  21.  
  22. using namespace std;
  23.  
  24. FILE *foutgr;
  25. char buf[2000000];
  26. int line = 0;
  27.  
  28. void error(const char *str, int line2 = line)
  29. {
  30. printf("WRONG\nLinia %d: %s\n", line2, str);
  31. exit(0);
  32. }
  33.  
  34. void read_ints(int n)
  35. {
  36. if (!n) // ma byc pusta linia - tak jakby jej mialo nie byc
  37. return;
  38. int len = 0;
  39. for (;;) // wczytuj aż dostaniesz niepust± linię (pomijaj±c puste)
  40. {
  41. for (;;) // wczytuj aż wczytasz cał± linię
  42. {
  43. if (len>=(int)sizeof(buf)-1) // koniec bufora
  44. error("Za długa linia.", line+1);
  45. char *ok = fgets(buf+len, sizeof(buf)-len, foutgr);
  46. if (!ok && !len)
  47. error("Za mało linii.", line+1);
  48. if (!ok) // koniec pliku = koniec linii
  49. break;
  50. for (int a = len; buf[a]; ++a) // pomin zbedne spacje
  51. if (buf[a]!=' ' || (buf[a]==' ' && len && buf[len-1]!=' '))
  52. buf[len++] = buf[a];
  53. if (len && buf[len-1]=='\n')
  54. { // koniec linii - usun znak konca i przerwij czytanie
  55. buf[--len] = 0;
  56. break;
  57. }
  58. }
  59. ++line;
  60. if (len)
  61. break;
  62. }
  63. while (len && buf[len-1]==' ')
  64. --len; // usun spacje z konca linii
  65. int dl = 0;
  66. REP(a, len)
  67. {
  68. if (!isdigit(buf[a]) && buf[a]!=' ')
  69. error("Nieprawidłowy znak.");
  70. if (isdigit(buf[a]))
  71. {
  72. if (!dl)
  73. --n;
  74. ++dl;
  75. if (dl>9 && (dl>10 || buf[a-9]!='1'))
  76. error("Liczba za duża.");
  77. }
  78. else
  79. {
  80. if (!n)
  81. error("¦mieci na końcu linii.");
  82. dl = 0;
  83. }
  84. }
  85. if (n)
  86. error("Za mało liczb w linii.");
  87. }
  88.  
  89. void end_of_file()
  90. {
  91. ++line;
  92. for (;;) // wczytuj i pomijaj puste linie
  93. {
  94. char *ok = fgets(buf, sizeof(buf), foutgr);
  95. if (!ok)
  96. break;
  97. int len = strlen(buf);
  98. REP(a, len)
  99. if (buf[a]!=' ' && buf[a]!='\n')
  100. error("¦mieci na końcu pliku.");
  101. if (len && buf[len-1]=='\n')
  102. {
  103. ++line;
  104. buf[--len] = 0;
  105. }
  106. }
  107. }
  108.  
  109. int N;
  110. int tab[100000]; // oryginalna wieza
  111. int usun[100000]; // czy usuwamy ten klocek
  112.  
  113. int licz() // ile klockow bedzie na swoich pozycjach
  114. {
  115. int wynik = 0;
  116. int p = 1;
  117. REP(a, N)
  118. if (!usun[a] && tab[a]==p++)
  119. ++wynik;
  120. return wynik;
  121. }
  122.  
  123. int main(int argc, char **argv)
  124. {
  125. if (argc!=4)
  126. {
  127. fprintf(stderr, "Potrzebuję trzech argumentów!!!\n");
  128. return -1;
  129. }
  130. FILE *fin = fopen(argv[1], "r");
  131. foutgr = fopen(argv[2], "r");
  132. FILE *foutok = fopen(argv[3], "r");
  133. if (fin==NULL || foutgr==NULL || foutok==NULL)
  134. {
  135. fprintf(stderr, "Nie umiem otworzyć plików!!!\n");
  136. return -2;
  137. }
  138. fscanf(fin, "%d", &N);
  139. REP(a, N)
  140. {
  141. fscanf(fin, "%d", &tab[a]);
  142. usun[a] = 0;
  143. }
  144. int ile_ok;
  145. fscanf(foutok, "%d", &ile_ok);
  146. REP(a, ile_ok)
  147. {
  148. int x;
  149. fscanf(foutok, "%d", &x);
  150. usun[x-1] = 1;
  151. }
  152. int opt = licz();
  153. REP(a, N)
  154. usun[a] = 0;
  155. int ile;
  156. read_ints(1);
  157. sscanf(buf, "%d", &ile);
  158. read_ints(ile);
  159. int p = 0; // aktualna pozycja w buforze
  160. REP(a, ile)
  161. {
  162. int x, c;
  163. char b = 0;
  164. swap(buf[p+20], b); // super trick przyspieszajacy, inaczej sscanf wolno dziala
  165. sscanf(buf+p, "%d%n", &x, &c);
  166. swap(buf[p+20], b);
  167. p += c;
  168. if (x<1 || x>N)
  169. {
  170. sprintf(buf, "Numer klocka %d spoza zakresu.", x);
  171. error(buf);
  172. }
  173. if (usun[x-1])
  174. {
  175. sprintf(buf, "Dwukrotna próba usunięcia klocka numer %d.", x);
  176. error(buf);
  177. }
  178. usun[x-1] = 1;
  179. }
  180. int wyn = licz();
  181. if (wyn!=opt)
  182. {
  183. sprintf(buf, "Wynik %d nieoptymalny (może być %d).", wyn, opt);
  184. error(buf);
  185. }
  186. end_of_file();
  187. printf("OK\n");
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement