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. rep(i, j) {
  77. if (z) b[i][j] = a[j][i];
  78. else b[i][j] = a[3 - j][3 - i];
  79. }
  80. return b;
  81. }
  82.  
  83.  
  84. board dir1(board a, char c) {
  85. if (c == 'U') return a;
  86. if (c == 'L') return flip1(a);
  87. if (c == 'R') return flip1(a, 0);
  88. return flip1(flip1(a, 0));
  89. }
  90.  
  91. board move1(board a, char c) {
  92. a = dir1(a, c);
  93. rep(j, i) {
  94. if (a[i][j] == 0) continue;
  95. for (int k = i + 1; k < 4; k++) {
  96. if (a[k][j] == 0) continue;
  97. if (a[i][j] == a[k][j]) {
  98. a[i][j] *= -2;
  99. a[k][j] = 0;
  100. }
  101. break;
  102. }
  103. }
  104. rep(i, j) if (a[i][j] < 0) a[i][j] = -a[i][j];
  105. rep(j, i) {
  106. if (a[i][j] > 0) continue;
  107. for (int k = i + 1; k < 4; k++) {
  108. if (a[k][j] > 0) {
  109. a[i][j] = a[k][j];
  110. a[k][j] = 0;
  111. break;
  112. }
  113. }
  114. }
  115. a = dir1(a, c);
  116. return a;
  117. }
  118.  
  119. bool over(board a, char c){
  120. board b;
  121. b = move1(a,c);
  122. rep(i,j){
  123. if(a[i][j]!=b[i][j]){
  124. return true;
  125. }
  126. }
  127. return false;
  128. }
  129.  
  130. int find_sum(board a, char c){
  131. board b;
  132. int s=0;
  133. b = move1(a,c);
  134. rep(i,j){
  135. if(b[i][j]==0){
  136. s++;
  137. }
  138. }
  139. return s;
  140. }
  141.  
  142. char play(board a) {
  143.  
  144. int sum_up,sum_down,sum_left,sum_right;
  145.  
  146. if(over(a,'U')){
  147. sum_up=-1;
  148. } else{
  149. sum_up=find_sum(a,'U');
  150. }
  151. if(over(a,'D')){
  152. sum_down=-1;
  153. } else{
  154. sum_down=find_sum(a,'D');
  155. }
  156. if(over(a,'R')){
  157. sum_right=-1;
  158. } else{
  159. sum_right=find_sum(a,'R');
  160. }
  161. if(over(a,'L')){
  162. sum_left=-1;
  163. } else{
  164. sum_left=find_sum(a,'L');
  165. }
  166.  
  167. if(sum_up>sum_left && sum_up>sum_right && sum_up>sum_down){
  168. return 'U';
  169. }
  170. if(sum_down>sum_left && sum_down>sum_right && sum_down>sum_up){
  171. return 'D';
  172. }
  173. if(sum_right>sum_left && sum_right>sum_down && sum_right>sum_up){
  174. return 'R';
  175. }
  176. return 'L';
  177. }
  178.  
  179. // Энд бичсэн хэсгээ л сервэрт илгээнэ
  180. // END
  181.  
  182. int main(int argc, char **argv) {
  183. string token;
  184. if (argc == 2) token = argv[1];
  185. srand(247);
  186. srand(time(0));
  187. board a; rep(i, j) a[i][j] = 0;
  188.  
  189. int itr = 0;
  190. clock_t begin = clock();
  191. while (true) {
  192. char c = play(a);
  193. rep(i, j) cout << a[i][j] << " \n"[j == 3];
  194. cout << c << "\n";
  195. if (c != 'U' && c != 'R' && c != 'D' && c != 'L') break;
  196. board b = move(a, c);
  197. if (itr > 0 && b == a) break;
  198. a = put(b);
  199. double timer = double(clock() - begin) / CLOCKS_PER_SEC;
  200. if (timer > 10) break;
  201. itr++;
  202. }
  203. int score = 0;
  204. rep(i, j) score += a[i][j];
  205. cout << "Score: " << score << endl;
  206. cout << "Last state:\n";
  207. rep(i, j) cout << a[i][j] << " \n"[j == 3];
  208. double timer = double(clock() - begin) / CLOCKS_PER_SEC;
  209. cout << "Time: " << (int)timer <<"sec\n";
  210. return 0;
  211. }
Success #stdin #stdout 0s 5284KB
stdin
Standard input is empty
stdout
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
L
0 0 0 2
0 0 0 0
0 0 0 0
0 0 0 0
L
2 0 0 0
2 0 0 0
0 0 0 0
0 0 0 0
L
Score: 4
Last state:
2 0 0 0
2 0 0 0
0 0 0 0
0 0 0 0
Time: 0sec