Advertisement
Guest User

Untitled

a guest
Jan 20th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <string>
  5. #include <set>
  6. #include <stack>
  7. #include <queue>
  8. #include <math.h>
  9. #include <cmath>
  10. #include <map>
  11. #include <numeric>
  12. #include <string.h>
  13. #include <fstream>
  14.  
  15. typedef long long ll;
  16. typedef long double ld;
  17.  
  18. #define FOR(i, a, b) for (int i = (a); i < (b); i++)
  19. #define F0R(i, a) for (int i = 0; i < (a); i++)
  20. #define FORd(i,a,b) for (int i = (b)-1; i >= (a); i--)
  21. #define F0Rd(i,a) for (int i = (a)-1; i >= 0; i--)
  22. #define pb push_back
  23. #define sz(x) (int)x.size()
  24. #define all(x) x.begin(), x.end()
  25. #define mp(a, b) make_pair(a, b)
  26. #define vi vector<int>
  27. #define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
  28.  
  29. using namespace std;
  30. int a[50], b[50];
  31. int n, k;
  32.  
  33. void body1(vi arr)
  34. {
  35. F0R(j, 4)
  36. FORd(i, 1, k + 1)
  37. {
  38. int r = ceil(sqrt(8 * i)) / 2, num = i - r*(r - 1) / 2;
  39. /*if (arr[i] == 2 && r < n)
  40. {
  41. arr[i + r] = 1;
  42. arr[i + r + 1] = 1;
  43. }
  44. else if (arr[i] == 4 && r < n - 1)
  45. {
  46. arr[i + r] = 2;
  47. arr[i + r + 1] = 2;
  48. }
  49. else if (arr[i] == 8 && r < n - 2)
  50. {
  51. arr[i + r] = 4;
  52. arr[i + r + 1] = 4;
  53. }*/
  54. if (arr[i] == 0)
  55. {
  56. if (r == n)//последний ряд
  57. {
  58. if (num == 1)
  59. {
  60. if (arr[i + 1] != 0 && arr[i - r + 1] != 0)
  61. arr[i] = arr[i - r + 1] - arr[i + 1];
  62. }
  63. else if (num < r)
  64. {
  65. if (arr[i - 1] != 0 && arr[i - r] != 0)
  66. arr[i] = arr[i - r] - arr[i - 1];
  67. else if (arr[i + 1] != 0 && arr[i - r + 1] != 0)
  68. arr[i] = arr[i - r + 1] - arr[i + 1];
  69. }
  70. else
  71. {
  72. if (arr[i - 1] != 0 && arr[i - r] != 0)
  73. arr[i] = arr[i - r] - arr[i - 1];
  74. }
  75. }
  76.  
  77. else if (r > 1)//все ряды кроме верхнего
  78. {
  79. if (arr[i + r] != 0 && arr[i + r + 1] != 0)
  80. arr[i] = arr[i + r] + arr[i + r + 1];
  81. if (num < r)
  82. if (arr[i + 1] != 0 && arr[i - r + 1] != 0)
  83. arr[i] = arr[i - r + 1] - arr[i + 1];
  84. if (num > 1)
  85. {
  86. if (arr[i - 1] != 0 && arr[i - r] != 0)
  87. arr[i] = arr[i - r] - arr[i - 1];
  88. }
  89. }
  90. else
  91. if (arr[i + 1] != 0 && arr[i + 2] != 0)
  92. arr[i] = arr[i + 1] + arr[i + 2];
  93. }
  94. }
  95. }
  96.  
  97. void rec(int w, vi vec)
  98. {
  99. int p = 1;
  100. vi arr = vec;
  101. for (int e = k; e > k - n; --e)
  102. {
  103. if (arr[e] == 0)
  104. {
  105. arr[e] = w;
  106. body1(arr);
  107. FORd(i, 1, k + 1)
  108. {
  109. int r = ceil(sqrt(8 * i)) / 2, num = i - r*(r - 1) / 2;
  110. /*if (a[i] == 2 && r < n)
  111. {
  112. a[i + r] = 1;
  113. a[i + r + 1] = 1;
  114. }
  115. else if (a[i] == 4 && r < n - 1)
  116. {
  117. a[i + r] = 2;
  118. a[i + r + 1] = 2;
  119. }
  120. else if (a[i] == 8 && r < n - 2)
  121. {
  122. a[i + r] = 4;
  123. a[i + r + 1] = 4;
  124. }*/
  125. if (r == n)//последний ряд
  126. {
  127. if (num == 1)
  128. {
  129. if (arr[i] != arr[i - r + 1] - arr[i + 1])
  130. return;
  131. }
  132. else if (num < r)
  133. {
  134. if (arr[i] != arr[i - r] - arr[i - 1] || arr[i] != arr[i - r + 1] - arr[i + 1])
  135. return;
  136. }
  137. else
  138. {
  139. if (arr[i] != arr[i - r] - arr[i - 1])
  140. return;
  141. }
  142. }
  143.  
  144. else if (r > 1)//все ряды кроме верхнего
  145. {
  146. if (arr[i] != arr[i + r] + arr[i + r + 1])
  147. return;
  148. if (num < r)
  149. if (arr[i] != arr[i - r + 1] - arr[i + 1])
  150. return;
  151. if (num > 1)
  152. {
  153. if (arr[i] != arr[i - r] - arr[i - 1])
  154. return;
  155. }
  156. }
  157. else
  158. if (arr[i] != arr[i + 1] + arr[i + 2])
  159. return;
  160.  
  161. }
  162. rec(p, arr);
  163. p++;
  164. }
  165. }
  166. }
  167.  
  168. int body(int cur)
  169. {
  170. F0R(j, k)
  171. {
  172. int c = cur;
  173. FORd(i, 1, k + 1)
  174. {
  175. int r = ceil(sqrt(8 * i)) / 2, num = i - r*(r - 1) / 2;
  176. if (a[i] == 2 && r < n)
  177. {
  178. a[i + r] = 1;
  179. a[i + r + 1] = 1;
  180. c--;
  181. }
  182. else if (a[i] == 4 && r < n - 1)
  183. {
  184. a[i + r] = 2;
  185. a[i + r + 1] = 2;
  186. c--;
  187. }
  188. else if (a[i] == 8 && r < n - 2)
  189. {
  190. a[i + r] = 4;
  191. a[i + r + 1] = 4;
  192. c--;
  193. }
  194. if (!b[i])
  195. {
  196. if (r == n)//последний ряд
  197. {
  198. if (num == 1)
  199. {
  200. if (b[i + 1] != 0 && b[i - r + 1] != 0)
  201. {
  202. b[i] = 1;
  203. a[i] = a[i - r + 1] - a[i + 1];
  204. c--;
  205. }
  206. }
  207. else if (num < r)
  208. {
  209. if (b[i - 1] != 0 && b[i - r] != 0)
  210. {
  211. a[i] = a[i - r] - a[i - 1];
  212. b[i] = 1;
  213. c--;
  214. }
  215. else if (b[i + 1] != 0 && b[i - r + 1] != 0)
  216. {
  217. b[i] = 1;
  218. a[i] = a[i - r + 1] - a[i + 1];
  219. c--;
  220. }
  221. }
  222. else
  223. {
  224. if (b[i - 1] != 0 && b[i - r] != 0)
  225. {
  226. b[i] = 1;
  227. a[i] = a[i - r] - a[i - 1];
  228. c--;
  229. }
  230. }
  231. }
  232.  
  233. else if (r > 1)//все ряды кроме верхнего
  234. {
  235. if (b[i + r] != 0 && b[i + r + 1] != 0)
  236. {
  237. b[i] = 1;
  238. a[i] = a[i + r] + a[i + r + 1];
  239. c--;
  240. }
  241. if (num < r)
  242. {
  243. if (b[i + 1] != 0 && b[i - r + 1] != 0)
  244. {
  245. b[i] = 1;
  246. a[i] = a[i - r + 1] - a[i + 1];
  247. c--;
  248. }
  249. }
  250. if (num > 1)
  251. {
  252. if (b[i - 1] != 0 && b[i - r] != 0)
  253. {
  254. b[i] = 1;
  255. a[i] = max(a[i], a[i - r] - a[i - 1]);
  256. c--;
  257. }
  258. }
  259. }
  260. //последний ряд
  261. else if (b[i + 1] != 0 && b[i + 2] != 0)
  262. {
  263. b[i] = 1;
  264. a[i] = a[i + 1] + a[i + 2];
  265. c--;
  266. }
  267. }
  268. }
  269. if (c == cur)
  270. break;
  271. cur = c;
  272. }
  273. return cur;
  274. }
  275.  
  276.  
  277. int main()
  278. {
  279. ios;
  280. cin >> n;
  281. k = n * (n + 1) / 2;
  282. int cur = 0;
  283. vi vec(k + 1);
  284. FOR(i, 1, k + 1)
  285. {
  286. cin >> a[i];
  287. if (a[i])
  288. b[i] = 1;
  289. else
  290. cur++;
  291. vec[i] = a[i];
  292. }
  293. int f = body(cur);
  294. if (f > 0)
  295. {
  296. rec(1, vec);
  297. }
  298. int p = 1;
  299. FOR(i, 1, k + 1)
  300. {
  301. int r = ceil(sqrt(8 * i)) / 2;
  302. if (r > p)
  303. {
  304. p++;
  305. cout << '\n';
  306. }
  307. cout << a[i] << " ";
  308. }
  309.  
  310. getchar();
  311. getchar();
  312. return 0;
  313. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement