Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7. int table[10];
  8. string code;
  9.  
  10. int max(int a, int b, int c) {
  11. return max(max(a, b), c);
  12. }
  13.  
  14. int max(int a, int b, int c, int d) {
  15. return max(max(a, b, c), d);
  16. }
  17. #define h(x) (table[x] == 0 ? 0 : (32 - __builtin_clz(p[x])))
  18. #define d(maxY) for(int id = maxY - 1 ; id >= 0 ; id --){ bool correct = true; for(int j = 0 ; j <= 9 ; j++)if(!(p[j] & (1 << (y + id)))){ correct = false; } if(correct){ dd++; for(int j = 0 ; j<= 9 ; j++)p[j] = ((p[j] >> (y+id+1)) << (y+id)) + p[j] % (1 << (y+id));} }
  19.  
  20. int calccount(int p[10], int nr, int solution) {
  21. int cp[10];
  22. for (int j = 0; j < 10; j++)cp[j] = p[j];
  23. int count = -1;
  24. if (nr >= code.length()) {
  25. return solution;
  26. }
  27. if (code[nr] == 'I') {
  28. for (int i = 0; i <= 9; i++) {
  29. int y = h(i);
  30. if (y <= 16) {
  31. p[i] = p[i] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)) + (1 << (y + 3)));
  32. int dd = 0;
  33. d(4);
  34. count = max(count, calccount(p, nr + 1, solution + dd));
  35. for (int j = 0; j < 10; j++) p[j] = cp[j];
  36. }
  37. }
  38. for (int i = 0; i <= 6; i++) {
  39. int y = max(h(i), h(i + 1), h(i + 2), h(i + 3));
  40. if (y <= 19) {
  41. for (int j = 0; j < 4; j++) {
  42. p[i + j] = p[i + j] | (1 << (y));
  43. }
  44. int dd = 0;
  45. d(1);
  46. count = max(count, calccount(p, nr + 1, solution + dd));
  47. for (int j = 0; j < 10; j++) {
  48. p[j] = cp[j];
  49. }
  50. }
  51. }
  52. }
  53. else if (code[nr] == 'J') {
  54. for (int i = 0; i <= 8; i++) {
  55. int y = max(h(i), h(i + 1));
  56. if (y <= 17) {
  57. p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
  58. p[i] = p[i] | (1 << y);
  59. int dd = 0;
  60. d(3);
  61. count = max(count, calccount(p, nr + 1, solution + dd));
  62. for (int j = 0; j < 10; j++) p[j] = cp[j];
  63. }
  64. }
  65. for (int i = 0; i <= 7; i++) {
  66. int y = max(h(i), h(i + 1), h(i + 2));
  67. if (y <= 18) {
  68. p[i] = p[i] | ((1 << y) + (1 << (y + 1)));
  69. p[i + 1] = p[i + 1] | (1 << y);
  70. p[i + 2] = p[i + 2] | (1 << y);
  71. int dd = 0;
  72. d(2);
  73. count = max(count, calccount(p, nr + 1, solution + dd));
  74. for (int j = 0; j < 10; j++) {
  75. p[j] = cp[j];
  76. }
  77. }
  78. }
  79. for (int i = 0; i <= 8; i++) {
  80. int y = max(h(i), h(i + 1) - 2);
  81. if (y <= 17) {
  82. p[i] = p[i] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
  83. p[i + 1] = p[i + 1] | (1 << (y + 2));
  84. int dd = 0;
  85. d(3);
  86. count = max(count, calccount(p, nr + 1, solution + dd));
  87. for (int j = 0; j < 10; j++) p[j] = cp[j];
  88. }
  89. }
  90. for (int i = 0; i <= 7; i++) {
  91. int y = max(h(i) - 1, h(i + 1) - 1, h(i + 2));
  92. if (y <= 18) {
  93. p[i + 2] = p[i + 2] | ((1 << y) + (1 << (y + 1)));
  94. p[i + 1] = p[i + 1] | (1 << (y + 1));
  95. p[i] = p[i] | (1 << (y + 1));
  96. int dd = 0;
  97. d(2);
  98. count = max(count, calccount(p, nr + 1, solution + dd));
  99. for (int j = 0; j < 10; j++) {
  100. p[j] = cp[j];
  101. }
  102. }
  103. }
  104. }
  105. else if (code[nr] == 'L') {
  106. for (int i = 0; i <= 8; i++) {
  107. int y = max(h(i), h(i + 1));
  108. if (y <= 16) {
  109. p[i] = p[i] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
  110. p[i + 1] = p[i + 1] | (1 << y);
  111. int dd = 0;
  112. d(3);
  113. count = max(count, calccount(p, nr + 1, solution + dd));
  114. for (int j = 0; j < 10; j++) p[j] = cp[j];
  115. }
  116. }
  117. for (int i = 0; i <= 7; i++) {
  118. int y = max(h(i), h(i + 1), h(i + 2));
  119. if (y <= 17) {
  120. p[i + 2] = p[i + 2] | ((1 << y) + (1 << (y + 1)));
  121. p[i + 1] = p[i + 1] | (1 << y);
  122. p[i] = p[i] | (1 << y);
  123. int dd = 0;
  124. d(2);
  125. count = max(count, calccount(p, nr + 1, solution + dd));
  126. for (int j = 0; j < 10; j++) {
  127. p[j] = cp[j];
  128. }
  129. }
  130. }
  131. for (int i = 0; i <= 8; i++) {
  132. int y = max(h(i) - 2, h(i + 1));
  133. if (y <= 17) {
  134. p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
  135. p[i] = p[i] | (1 << (y + 2));
  136. int dd = 0;
  137. d(3);
  138. count = max(count, calccount(p, nr + 1, solution + dd));
  139. for (int j = 0; j < 10; j++) p[j] = cp[j];
  140. }
  141. }
  142. for (int i = 0; i <= 7; i++) {
  143. int y = max(h(i), h(i + 1) - 1, h(i + 2) - 1);
  144. if (y <= 18) {
  145. p[i] = p[i] | ((1 << y) + (1 << (y + 1)));
  146. p[i + 1] = p[i + 1] | (1 << (y + 1));
  147. p[i + 2] = p[i + 2] | (1 << (y + 1));
  148. int dd = 0;
  149. d(2);
  150. count = max(count, calccount(p, nr + 1, solution + dd));
  151. for (int j = 0; j < 10; j++) {
  152. p[j] = cp[j];
  153. }
  154. }
  155. }
  156. }
  157. else if (code[nr] == 'O') {
  158. for (int i = 0; i <= 8; i++) {
  159. int y = max(h(i), h(i + 1));
  160. if (y <= 18) {
  161. p[i] = p[i] | ((1 << y) + (1 << (y + 1)));
  162. p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)));
  163. int dd = 0;
  164. d(2);
  165. count = max(count, calccount(p, nr + 1, solution + dd));
  166. for (int j = 0; j < 10; j++) {
  167. p[j] = cp[j];
  168. }
  169. }
  170. }
  171. }
  172. else if (code[nr] == 'S') {
  173. for (int i = 0; i <= 8; i++) {
  174. int y = max(h(i) - 1, h(i + 1));
  175. if (y <= 17) {
  176. p[i] = p[i] | ((1 << (y + 1)) + (1 << (y + 2)));
  177. p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)));
  178. int dd = 0;
  179. d(3);
  180. count = max(count, calccount(p, nr + 1, solution + dd));
  181. for (int j = 0; j < 10; j++) p[j] = cp[j];
  182. }
  183. }
  184. for (int i = 0; i <= 7; i++) {
  185. int y = max(h(i), h(i + 1), h(i + 2) - 1);
  186. if (y <= 18) {
  187. p[i] = p[i] | (1 << y);
  188. p[i + 1] = p[i + 1] | ((1 << (y + 1)) + (1 << y));
  189. p[i + 2] = p[i + 2] | (1 << (y + 1));
  190. int dd = 0;
  191. d(2);
  192. count = max(count, calccount(p, nr + 1, solution + dd));
  193. for (int j = 0; j < 10; j++) {
  194. p[j] = cp[j];
  195. }
  196. }
  197. }
  198. }
  199. else if (code[nr] == 'T') {
  200. for (int i = 0; i <= 8; i++) {
  201. int y = max(h(i), h(i + 1) - 1);
  202. if (y <= 17) {
  203. p[i] = p[i] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
  204. p[i + 1] = p[i + 1] | (1 << (y + 1));
  205. int dd = 0;
  206. d(3);
  207. count = max(count, calccount(p, nr + 1, solution + dd));
  208. for (int j = 0; j < 10; j++) p[j] = cp[j];
  209. }
  210. }
  211. for (int i = 0; i <= 8; i++) {
  212. int y = max(h(i) - 1, h(i + 1));
  213. if (y <= 17) {
  214. p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)) + (1 << (y + 2)));
  215. p[i] = p[i] | (1 << (y + 1));
  216. int dd = 0;
  217. d(3);
  218. count = max(count, calccount(p, nr + 1, solution + dd));
  219. for (int j = 0; j < 10; j++) p[j] = cp[j];
  220. }
  221. }
  222. for (int i = 0; i <= 7; i++) {
  223. int y = max(h(i), h(i + 1), h(i + 2));
  224. if (y <= 18) {
  225. p[i + 2] = p[i + 2] | (1 << y);
  226. p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)));
  227. p[i] = p[i] | (1 << y);
  228. int dd = 0;
  229. d(2);
  230. count = max(count, calccount(p, nr + 1, solution + dd));
  231. for (int j = 0; j < 10; j++) {
  232. p[j] = cp[j];
  233. }
  234. }
  235. }
  236. for (int i = 0; i <= 7; i++) {
  237. int y = max(h(i) - 1, h(i + 1), h(i + 2) - 1);
  238. if (y <= 18) {
  239. p[i + 2] = p[i + 2] | (1 << (y + 1));
  240. p[i + 1] = p[i + 1] | ((1 << y) + (1 << (y + 1)));
  241. p[i] = p[i] | (1 << (y + 1));
  242. int dd = 0;
  243. d(2);
  244. count = max(count, calccount(p, nr + 1, solution + dd));
  245. for (int j = 0; j < 10; j++) {
  246. p[j] = cp[j];
  247. }
  248. }
  249. }
  250. }
  251. else {
  252. for (int i = 0; i <= 8; i++) {
  253. int y = max(h(i), h(i + 1) - 1);
  254. if (y <= 17) {
  255. p[i] = p[i] | ((1 << y) + (1 << (y + 1)));
  256. p[i + 1] = p[i + 1] | ((1 << (y + 1)) + (1 << (y + 2)));
  257. int dd = 0;
  258. d(3);
  259. count = max(count, calccount(p, nr + 1, solution + dd));
  260. for (int j = 0; j < 10; j++) p[j] = cp[j];
  261. }
  262. }
  263. for (int i = 0; i <= 7; i++) {
  264. int y = max(h(i) - 1, h(i + 1), h(i + 2));
  265. if (y <= 18) {
  266. p[i] = p[i] | (1 << (y + 1));
  267. p[i + 1] = p[i + 1] | ((1 << (y + 1)) + (1 << y));
  268. p[i + 2] = p[i + 2] | (1 << y);
  269. int dd = 0;
  270. d(2);
  271. count = max(count, calccount(p, nr + 1, solution + dd));
  272. for (int j = 0; j < 10; j++) {
  273. p[j] = cp[j];
  274. }
  275. }
  276. }
  277. }
  278. return count;
  279. }
  280.  
  281. int main() {
  282.  
  283. for (int i = 0; i < 20; i++) {
  284. for (int j = 0; j < 10; j++) {
  285. char c;
  286. cin >> c;
  287. if (c != '.') {
  288. table[j] = (table[j] | (1 << (19 - i)));
  289. }
  290. }
  291. }
  292. cin >> code;
  293. int nr = 0, solution = 0;
  294. cout << calccount(table, 0, 0);
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement