fork(3) download
  1. #include <iostream>
  2. #include <math.h>
  3.  
  4.  
  5.  
  6. const double PI = 3.14159265;
  7.  
  8. template<typename Type>
  9. auto bezwzgledna(Type var)
  10. {
  11. if (var < 0)
  12. return -var;
  13. else
  14. return var;
  15. }
  16.  
  17.  
  18. class Wspolrzedna
  19. {
  20. private:
  21.  
  22. public:
  23. double x;
  24. double y;
  25. Wspolrzedna() {}
  26. Wspolrzedna(double a, double b) : x(a), y(b) {}
  27. bool operator==(Wspolrzedna & druga)
  28. {
  29. if (x == druga.x && y == druga.y)
  30. return true;
  31. else
  32. return false;
  33. }
  34. };
  35.  
  36. class Bierka
  37. {
  38. private:
  39. bool minus(double a) { if (a < 0) return true; else return false; }
  40. bool getLineIntersection(double p0_x, double p0_y, double p1_x, double p1_y, double p2_x, double p2_y, double p3_x, double p3_y)
  41. {
  42. double s1_x, s1_y, s2_x, s2_y;
  43. s1_x = p1_x - p0_x;
  44. s1_y = p1_y - p0_y;
  45. s2_x = p3_x - p2_x;
  46. s2_y = p3_y - p2_y;
  47. double s, t;
  48. s = (-s1_y * (p0_x - p2_x) + s1_x * (p0_y - p2_y)) / (-s2_x * s1_y + s1_x * s2_y);
  49. t = (s2_x * (p0_y - p2_y) - s2_y * (p0_x - p2_x)) / (-s2_x * s1_y + s1_x * s2_y);
  50.  
  51.  
  52.  
  53. if (s > 0 && s < 1 && t > 0 && t < 1)
  54. return true;
  55. else
  56. return false;
  57.  
  58. }
  59.  
  60. public:
  61. Wspolrzedna pierwsza;
  62. Wspolrzedna druga;
  63. Bierka() {}
  64. Bierka(double x1, double y1, double x2, double y2) : pierwsza(x1, y1), druga(x1, y1) {}
  65. bool null() {
  66. if (pierwsza == druga)
  67. return true;
  68. else
  69. return false;
  70. }
  71. bool L(Bierka & second);
  72. bool X(Bierka & second) { return getLineIntersection(pierwsza.x, pierwsza.y, druga.x, druga.y, second.pierwsza.x, second.pierwsza.y, second.druga.x, second.druga.y); }
  73. bool V(Bierka & second);
  74. bool koniec_styczny(Bierka & second);
  75.  
  76.  
  77. // Metody sprawdzające czy funkcja jest stała i jaka konkretnie
  78. bool stala() { if (pierwsza.x == druga.x || pierwsza.y == druga.y) return true; else return false; }
  79. bool stala_y() { if (pierwsza.x == druga.x) return true; else return false; }
  80. bool stala_x() { if (pierwsza.y == druga.y) return true; else return false; }
  81. };
  82.  
  83. bool Bierka::koniec_styczny(Bierka & second)
  84. {
  85. if (
  86. ((druga == second.druga) && !(pierwsza == second.pierwsza)) ||
  87. ((druga == second.pierwsza) && !(pierwsza == second.druga)) ||
  88. (!(druga == second.druga) && (pierwsza == second.pierwsza)) ||
  89. (!(druga == second.pierwsza) && (pierwsza == second.druga))
  90. )
  91. return true;
  92. else
  93. return false;
  94. }
  95.  
  96. bool Bierka::L(Bierka & second)
  97. {
  98. if (koniec_styczny(second) && !stala() && !second.stala())
  99. {
  100. double a1, a2;
  101.  
  102. if (druga.x != pierwsza.x)
  103. a1 = (druga.y - pierwsza.y) / (druga.x - pierwsza.x);
  104. else
  105. a1 = 0;
  106. if (second.druga.x != second.pierwsza.x)
  107. a2 = (second.druga.y - second.pierwsza.y) / (second.druga.x - second.pierwsza.x);
  108. else
  109. a2 = 0;
  110.  
  111. if (a1*a2 == -1)
  112. return true;
  113. else return false;
  114. }
  115. else if (koniec_styczny(second) && ((stala_x() && second.stala_y()) || (stala_y() && second.stala_x())))
  116. return true;
  117. else
  118. return false;
  119.  
  120. }
  121.  
  122.  
  123.  
  124. bool Bierka::V(Bierka & second)
  125. {
  126. if (koniec_styczny(second))
  127. {
  128. double x_vektora, y_vektora, second_x_vektora, second_y_vektora;
  129.  
  130. // Warunki określające początek wektorów (tak aby oba wektory miały początek w punkcie wspólnym
  131. if (druga == second.druga)
  132. {
  133. x_vektora = pierwsza.x - druga.x;
  134. y_vektora = pierwsza.y - druga.y;
  135. second_x_vektora = second.pierwsza.x - second.druga.x;
  136. second_y_vektora = second.pierwsza.y - second.druga.y;
  137. }
  138. else if (druga == second.pierwsza)
  139. {
  140. x_vektora = pierwsza.x - druga.x;
  141. y_vektora = pierwsza.y - druga.y;
  142. second_x_vektora = second.druga.x - second.pierwsza.x;
  143. second_y_vektora = second.druga.y - second.pierwsza.y;
  144. }
  145. else if (pierwsza == second.druga)
  146. {
  147. x_vektora = druga.x - pierwsza.x;
  148. y_vektora = druga.y - pierwsza.y;
  149. second_x_vektora = second.pierwsza.x - second.druga.x;
  150. second_y_vektora = second.pierwsza.y - second.druga.y;
  151. }
  152. else if (pierwsza == second.pierwsza)
  153. {
  154. x_vektora = druga.x - pierwsza.x;
  155. y_vektora = druga.y - pierwsza.y;
  156. second_x_vektora = second.druga.x - second.pierwsza.x;
  157. second_y_vektora = second.druga.y - second.pierwsza.y;
  158. }
  159.  
  160.  
  161.  
  162. double angle;
  163.  
  164.  
  165. double kat_main = atan2(y_vektora, x_vektora) * 180 / PI;
  166. double kat_second = atan2(second_y_vektora, second_x_vektora) * 180 / PI;
  167.  
  168. // warunki sprawdzające czy atan dało wynik ujemny
  169. if (kat_main < 0)
  170. kat_main = 360 - bezwzgledna(kat_main);
  171. if (kat_second < 0)
  172. kat_second = 360 - bezwzgledna(kat_second);
  173.  
  174. angle = bezwzgledna(kat_main - kat_second);
  175.  
  176. if (angle < 90 && angle > 0)
  177. return true;
  178. else
  179. return false;
  180. }
  181. }
  182.  
  183.  
  184.  
  185. int main()
  186. {
  187. int ile;
  188. std::cin >> ile;
  189. Bierka * bierki = new Bierka[ile * 2];
  190. double x1, y1, x2, y2;
  191.  
  192. for (int i = 0; i < ile * 2; i++)
  193. {
  194. std::cin >> x1 >> y1 >> x2 >> y2;
  195. bierki[i].pierwsza.x = x1;
  196. bierki[i].pierwsza.y = y1;
  197. bierki[i].druga.x = x2;
  198. bierki[i].druga.y = y2;
  199. }
  200. char * liczby_rzymskie = new char[ile];
  201. for (int i = 0, g = 0; i < ile * 2; i += 2, g++)
  202. {
  203. if (bierki[i].L(bierki[i + 1]))
  204. liczby_rzymskie[g] = 'L';
  205.  
  206. else if (bierki[i].X(bierki[i + 1]))
  207. liczby_rzymskie[g] = 'X';
  208.  
  209. else if (bierki[i].V(bierki[i + 1]))
  210. liczby_rzymskie[g] = 'V';
  211.  
  212. else
  213. liczby_rzymskie[g] = '-';
  214. }
  215.  
  216. long double iloczyn = 1;
  217. for (int i = 0; i < ile; i++)
  218. {
  219. switch (liczby_rzymskie[i])
  220. {
  221. case 'L':
  222. printf("L\n");
  223. iloczyn *= 50;
  224. break;
  225. case 'X':
  226. printf("X\n");
  227. iloczyn *= 10;
  228. break;
  229. case 'V':
  230. printf("V\n");
  231. iloczyn *= 5;
  232. break;
  233. case '-':
  234. printf("-\n");
  235. }
  236. }
  237. printf("%.llf", iloczyn);
  238.  
  239. delete[] liczby_rzymskie;
  240. delete[] bierki;
  241.  
  242. return 0;
  243. }
Runtime error #stdin #stdout #stderr 0s 3460KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
terminate called after throwing an instance of 'std::bad_array_new_length'
  what():  std::bad_array_new_length