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.  
  168. char up = 'U';
  169. char down = 'D';
  170. char left = 'L';
  171. char right = 'R';
  172. int sum_up,sum_down,sum_left,sum_right;
  173.  
  174. board b;
  175.  
  176. b = move1(a, up);
  177. sum_up=find_sum(b);
  178. if(over(a,up)){
  179. sum_up=0;
  180. }
  181.  
  182. b = move1(a, down);
  183. sum_down=find_sum(b);
  184. if(over(a,down)){
  185. sum_down=0;
  186. }
  187.  
  188. b = move1(a, right);
  189. sum_right=find_sum(b);
  190. if(over(a,right)){
  191. sum_right=0;
  192. }
  193.  
  194. b = move1(a, left);
  195. sum_left=find_sum(b);
  196. if(over(a,left)){
  197. sum_left=0;
  198. }
  199.  
  200. if(sum_right==sum_left && sum_up==sum_down){
  201. return up;
  202. }
  203. if(sum_right>sum_left && sum_right>sum_up && sum_right>sum_down){
  204. return right;
  205. }
  206. if(sum_left>sum_right && sum_left>sum_up && sum_left>sum_down){
  207. return left;
  208. }
  209. if(sum_down>sum_up && sum_down>sum_left && sum_down>sum_right){
  210. return down;
  211. }
  212. return up;
  213. }
  214.  
  215. // Энд бичсэн хэсгээ л сервэрт илгээнэ
  216. // END
  217.  
  218. int main(int argc, char **argv) {
  219. string token;
  220. if (argc == 2) token = argv[1];
  221. srand(247);
  222. srand(time(0));
  223. board a; rep(i, j) a[i][j] = 0;
  224.  
  225. int itr = 0;
  226. clock_t begin = clock();
  227. while (true) {
  228. char c = play(a);
  229. rep(i, j) cout << a[i][j] << " \n"[j == 3];
  230. cout << c << "\n";
  231. if (c != 'U' && c != 'R' && c != 'D' && c != 'L') break;
  232. board b = move(a, c);
  233. if (itr > 0 && b == a) break;
  234. a = put(b);
  235. double timer = double(clock() - begin) / CLOCKS_PER_SEC;
  236. if (timer > 10) break;
  237. itr++;
  238. }
  239. int score = 0;
  240. rep(i, j) score += a[i][j];
  241. cout << "Score: " << score << endl;
  242. cout << "Last state:\n";
  243. rep(i, j) cout << a[i][j] << " \n"[j == 3];
  244. double timer = double(clock() - begin) / CLOCKS_PER_SEC;
  245. cout << "Time: " << (int)timer <<"sec\n";
  246. return 0;
  247. }
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
U
0 0 2 0
0 0 0 0
0 0 0 0
0 0 0 0
U
Score: 2
Last state:
0 0 2 0
0 0 0 0
0 0 0 0
0 0 0 0
Time: 0sec