fork download
  1. #include <array>
  2. #include <ctime>
  3. #include <vector>
  4. #include <cstdlib>
  5. #include <iostream>
  6. // #include "solution.h"
  7. using namespace std;
  8.  
  9. #define rep(i, j) for (int i = 0; i < 4; i++)\
  10. for (int j = 0; j < 4; j++)
  11.  
  12. typedef array<array<int, 4>, 4> board;
  13.  
  14. board flip(board a, bool z = 1) {
  15. board b;
  16. rep(i, j) {
  17. if (z) b[i][j] = a[j][i];
  18. else b[i][j] = a[3 - j][3 - i];
  19. }
  20. return b;
  21. }
  22.  
  23.  
  24. board dir(board a, char c) {
  25. if (c == 'U') return a;
  26. if (c == 'L') return flip(a);
  27. if (c == 'R') return flip(a, 0);
  28. return flip(flip(a, 0));
  29. }
  30.  
  31. board move(board a, char c) {
  32. a = dir(a, c);
  33. rep(j, i) {
  34. if (a[i][j] == 0) continue;
  35. for (int k = i + 1; k < 4; k++) {
  36. if (a[k][j] == 0) continue;
  37. if (a[i][j] == a[k][j]) {
  38. a[i][j] *= -2;
  39. a[k][j] = 0;
  40. }
  41. break;
  42. }
  43. }
  44. rep(i, j) if (a[i][j] < 0) a[i][j] = -a[i][j];
  45. rep(j, i) {
  46. if (a[i][j] > 0) continue;
  47. for (int k = i + 1; k < 4; k++) {
  48. if (a[k][j] > 0) {
  49. a[i][j] = a[k][j];
  50. a[k][j] = 0;
  51. break;
  52. }
  53. }
  54. }
  55. a = dir(a, c);
  56. return a;
  57. }
  58.  
  59. board put(board a) {
  60. vector<pair<int, int>> zeros;
  61. rep(i, j) if (a[i][j] == 0) zeros.push_back({i, j});
  62. int p = rand() % 100;
  63. int k = rand() % zeros.size();
  64. int i = zeros[k].first;
  65. int j = zeros[k].second;
  66. int val = (p < 10) ? 4 : 2;
  67. a[i][j] = val;
  68. return a;
  69. }
  70.  
  71. // BEGIN
  72. // Энд функц заралж ашиглаж болно
  73.  
  74. board flip1(board a, bool z = 1) {
  75. board b;
  76. for (int i = 0; i < 4; i++) {
  77. for (int j = 0; j < 4; j++) {
  78. if (z)
  79. b[i][j] = a[j][i];
  80. else
  81. b[i][j] = a[3 - j][3 - i];
  82. }
  83. }
  84. return b;
  85. }
  86.  
  87. board dir1(board a, char c) {
  88. if (c == 'U')
  89. return a;
  90. if (c == 'L')
  91. return flip1(a);
  92. if (c == 'R')
  93. return flip1(a, 0);
  94. return flip1(flip1(a, 0));
  95. }
  96.  
  97. board move1(board a, char c) {
  98. a = dir1(a, c);
  99. for (int j = 0; j < 4; j++) {
  100. for (int i = 0; i < 4; i++) {
  101. if (a[i][j] == 0) continue;
  102. for (int k = i + 1; k < 4; k++) {
  103. if (a[k][j] == 0) continue;
  104. if (a[i][j] == a[k][j]) {
  105. a[i][j] *= -2;
  106. a[k][j] = 0;
  107. }
  108. break;
  109. }
  110. }
  111. }
  112. for (int i = 0; i < 4; i++) {
  113. for (int j = 0; j < 4; j++) {
  114. if (a[i][j] < 0) a[i][j] = -a[i][j];
  115. }
  116. }
  117. for (int j = 0; j < 4; j++) {
  118. for (int i = 0; i < 4; i++) {
  119. if (a[i][j] > 0) continue;
  120. for (int k = i + 1; k < 4; k++) {
  121. if (a[k][j] > 0) {
  122. a[i][j] = a[k][j];
  123. a[k][j] = 0;
  124. break;
  125. }
  126. }
  127. }
  128. }
  129. a = dir1(a, c);
  130. return a;
  131. }
  132.  
  133. bool over(const board& a, char move) {
  134. board b = move1(a, move);
  135. for (int i = 0; i < 4; i++) {
  136. for (int j = 0; j < 4; j++) {
  137. if (b[i][j] == 0) {
  138. return false;
  139. }
  140. }
  141. }
  142. for (int i = 0; i < 4; i++) {
  143. for (int j = 0; j < 4; j++) {
  144. if ((i < 3 && b[i][j] == b[i + 1][j]) || (j < 3 && b[i][j] == b[i][j + 1])) {
  145. return false;
  146. }
  147. }
  148. }
  149. return true;
  150. }
  151.  
  152. int find_sum(board a){
  153. int s=0;
  154. for (int i = 0; i < 4; i++){
  155. for (int j =0; j < 4; j++){
  156. if (a[i][j]==0){
  157. s++;
  158. }
  159. }
  160. }
  161. return s;
  162. }
  163.  
  164.  
  165.  
  166. char play(board a) {
  167. char up = 'U';
  168. char down = 'D';
  169. char left = 'L';
  170. char right = 'R';
  171.  
  172. int sum_up = find_sum(move1(a, up));
  173. int sum_down = find_sum(move1(a, down));
  174. int sum_left = find_sum(move1(a, left));
  175. int sum_right = find_sum(move1(a, right));
  176.  
  177. if (over(a, up)) sum_up = 0;
  178. if (over(a, down)) sum_down = 0;
  179. if (over(a, left)) sum_left = 0;
  180. if (over(a, right)) sum_right = 0;
  181.  
  182. if (sum_right > sum_left && sum_right > sum_up && sum_right > sum_down) {
  183. return right;
  184. }
  185. if (sum_left > sum_right && sum_left > sum_up && sum_left > sum_down) {
  186. return left;
  187. }
  188. if (sum_down > sum_up && sum_down > sum_left && sum_down > sum_right) {
  189. return down;
  190. }
  191. if (sum_up > sum_down && sum_up > sum_left && sum_up > sum_right) {
  192. return up;
  193. }
  194. return 0;
  195. }
  196.  
  197. // Энд бичсэн хэсгээ л сервэрт илгээнэ
  198. // END
  199.  
  200. int main(int argc, char **argv) {
  201. string token;
  202. if (argc == 2) token = argv[1];
  203. srand(247);
  204. srand(time(0));
  205. board a; rep(i, j) a[i][j] = 0;
  206.  
  207. int itr = 0;
  208. clock_t begin = clock();
  209. while (true) {
  210. char c = play(a);
  211. rep(i, j) cout << a[i][j] << " \n"[j == 3];
  212. cout << c << "\n";
  213. if (c != 'U' && c != 'R' && c != 'D' && c != 'L') break;
  214. board b = move(a, c);
  215. if (itr > 0 && b == a) break;
  216. a = put(b);
  217. double timer = double(clock() - begin) / CLOCKS_PER_SEC;
  218. if (timer > 10) break;
  219. itr++;
  220. }
  221. int score = 0;
  222. rep(i, j) score += a[i][j];
  223. cout << "Score: " << score << endl;
  224. cout << "Last state:\n";
  225. rep(i, j) cout << a[i][j] << " \n"[j == 3];
  226. double timer = double(clock() - begin) / CLOCKS_PER_SEC;
  227. cout << "Time: " << (int)timer <<"sec\n";
  228. return 0;
  229. }
Success #stdin #stdout 0s 5304KB
stdin
Standard input is empty
stdout
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

Score: 0
Last state:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
Time: 0sec