#include <array>
#include <ctime>
#include <vector>
#include <cstdlib>
#include <iostream>
// #include "solution.h"
using namespace std;
#define rep(i, j) for (int i = 0; i < 4; i++)\
for (int j = 0; j < 4; j++)
typedef array<array<int, 4>, 4> board;
board flip(board a, bool z = 1) {
board b;
rep(i, j) {
if (z) b[i][j] = a[j][i];
else b[i][j] = a[3 - j][3 - i];
}
return b;
}
board dir(board a, char c) {
if (c == 'U') return a;
if (c == 'L') return flip(a);
if (c == 'R') return flip(a, 0);
return flip(flip(a, 0));
}
board move(board a, char c) {
a = dir(a, c);
rep(j, i) {
if (a[i][j] == 0) continue;
for (int k = i + 1; k < 4; k++) {
if (a[k][j] == 0) continue;
if (a[i][j] == a[k][j]) {
a[i][j] *= -2;
a[k][j] = 0;
}
break;
}
}
rep(i, j) if (a[i][j] < 0) a[i][j] = -a[i][j];
rep(j, i) {
if (a[i][j] > 0) continue;
for (int k = i + 1; k < 4; k++) {
if (a[k][j] > 0) {
a[i][j] = a[k][j];
a[k][j] = 0;
break;
}
}
}
a = dir(a, c);
return a;
}
board put(board a) {
vector<pair<int, int>> zeros;
rep(i, j) if (a[i][j] == 0) zeros.push_back({i, j});
int p = rand() % 100;
int k = rand() % zeros.size();
int i = zeros[k].first;
int j = zeros[k].second;
int val = (p < 10) ? 4 : 2;
a[i][j] = val;
return a;
}
// BEGIN
// Энд функц заралж ашиглаж болно
board flip1(board a, bool z = 1) {
board b;
rep(i, j) {
if (z) b[i][j] = a[j][i];
else b[i][j] = a[3 - j][3 - i];
}
return b;
}
board dir1(board a, char c) {
if (c == 'U') return a;
if (c == 'L') return flip1(a);
if (c == 'R') return flip1(a, 0);
return flip1(flip1(a, 0));
}
board move1(board a, char c) {
a = dir1(a, c);
rep(j, i) {
if (a[i][j] == 0) continue;
for (int k = i + 1; k < 4; k++) {
if (a[k][j] == 0) continue;
if (a[i][j] == a[k][j]) {
a[i][j] *= -2;
a[k][j] = 0;
}
break;
}
}
rep(i, j) if (a[i][j] < 0) a[i][j] = -a[i][j];
rep(j, i) {
if (a[i][j] > 0) continue;
for (int k = i + 1; k < 4; k++) {
if (a[k][j] > 0) {
a[i][j] = a[k][j];
a[k][j] = 0;
break;
}
}
}
a = dir1(a, c);
return a;
}
bool over(board a, char c){
board b;
b = move1(a,c);
rep(i,j){
if(a[i][j]!=b[i][j]){
return true;
}
}
return false;
}
int find_sum(board a, char c){
board b;
int s=0;
b = move1(a,c);
rep(i,j){
if(b[i][j]==0){
s++;
}
}
return s;
}
char play(board a) {
int sum_up,sum_down,sum_left,sum_right;
if(over(a,'U')){
sum_up=-1;
} else{
sum_up=find_sum(a,'U');
}
if(over(a,'D')){
sum_down=-1;
} else{
sum_down=find_sum(a,'D');
}
if(over(a,'R')){
sum_right=-1;
} else{
sum_right=find_sum(a,'R');
}
if(over(a,'L')){
sum_left=-1;
} else{
sum_left=find_sum(a,'L');
}
if(sum_up>sum_left && sum_up>sum_right && sum_up>sum_down){
return 'U';
}
if(sum_down>sum_left && sum_down>sum_right && sum_down>sum_up){
return 'D';
}
if(sum_right>sum_left && sum_right>sum_down && sum_right>sum_up){
return 'R';
}
return 'L';
}
// Энд бичсэн хэсгээ л сервэрт илгээнэ
// END
int main(int argc, char **argv) {
string token;
if (argc == 2) token = argv[1];
srand(247);
srand(time(0));
board a; rep(i, j) a[i][j] = 0;
int itr = 0;
clock_t begin = clock();
while (true) {
char c = play(a);
rep(i, j) cout << a[i][j] << " \n"[j == 3];
cout << c << "\n";
if (c != 'U' && c != 'R' && c != 'D' && c != 'L') break;
board b = move(a, c);
if (itr > 0 && b == a) break;
a = put(b);
double timer = double(clock() - begin) / CLOCKS_PER_SEC;
if (timer > 10) break;
itr++;
}
int score = 0;
rep(i, j) score += a[i][j];
cout << "Score: " << score << endl;
cout << "Last state:\n";
rep(i, j) cout << a[i][j] << " \n"[j == 3];
double timer = double(clock() - begin) / CLOCKS_PER_SEC;
cout << "Time: " << (int)timer <<"sec\n";
return 0;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8Y3RpbWU+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8aW9zdHJlYW0+Ci8vICNpbmNsdWRlICJzb2x1dGlvbi5oIgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSByZXAoaSwgaikgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspXAoJZm9yIChpbnQgaiA9IDA7IGogPCA0OyBqKyspCgp0eXBlZGVmIGFycmF5PGFycmF5PGludCwgND4sIDQ+IGJvYXJkOwoKYm9hcmQgZmxpcChib2FyZCBhLCBib29sIHogPSAxKSB7Cglib2FyZCBiOwoJcmVwKGksIGopIHsKCQlpZiAoeikgYltpXVtqXSA9IGFbal1baV07CgkJZWxzZSBiW2ldW2pdID0gYVszIC0gal1bMyAtIGldOwoJfQoJcmV0dXJuIGI7Cn0KCgpib2FyZCBkaXIoYm9hcmQgYSwgY2hhciBjKSB7CglpZiAoYyA9PSAnVScpIHJldHVybiBhOwoJaWYgKGMgPT0gJ0wnKSByZXR1cm4gZmxpcChhKTsKCWlmIChjID09ICdSJykgcmV0dXJuIGZsaXAoYSwgMCk7CglyZXR1cm4gZmxpcChmbGlwKGEsIDApKTsKfQoKYm9hcmQgbW92ZShib2FyZCBhLCBjaGFyIGMpIHsKCWEgPSBkaXIoYSwgYyk7CglyZXAoaiwgaSkgewoJCWlmIChhW2ldW2pdID09IDApIGNvbnRpbnVlOwoJCWZvciAoaW50IGsgPSBpICsgMTsgayA8IDQ7IGsrKykgewoJCQlpZiAoYVtrXVtqXSA9PSAwKSBjb250aW51ZTsKCQkJaWYgKGFbaV1bal0gPT0gYVtrXVtqXSkgewoJCQkJYVtpXVtqXSAqPSAtMjsKCQkJCWFba11bal0gPSAwOwoJCQl9CgkJCWJyZWFrOwoJCX0KCX0KCXJlcChpLCBqKSBpZiAoYVtpXVtqXSA8IDApIGFbaV1bal0gPSAtYVtpXVtqXTsKCXJlcChqLCBpKSB7CgkJaWYgKGFbaV1bal0gPiAwKSBjb250aW51ZTsKCQlmb3IgKGludCBrID0gaSArIDE7IGsgPCA0OyBrKyspIHsKCQkJaWYgKGFba11bal0gPiAwKSB7CgkJCQlhW2ldW2pdID0gYVtrXVtqXTsKCQkJCWFba11bal0gPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9CglhID0gZGlyKGEsIGMpOwoJcmV0dXJuIGE7Cn0KCmJvYXJkIHB1dChib2FyZCBhKSB7Cgl2ZWN0b3I8cGFpcjxpbnQsIGludD4+IHplcm9zOwoJcmVwKGksIGopIGlmIChhW2ldW2pdID09IDApIHplcm9zLnB1c2hfYmFjayh7aSwgan0pOwoJaW50IHAgPSByYW5kKCkgJSAxMDA7CglpbnQgayA9IHJhbmQoKSAlIHplcm9zLnNpemUoKTsKCWludCBpID0gemVyb3Nba10uZmlyc3Q7CglpbnQgaiA9IHplcm9zW2tdLnNlY29uZDsKCWludCB2YWwgPSAocCA8IDEwKSA/IDQgOiAyOwoJYVtpXVtqXSA9IHZhbDsKCXJldHVybiBhOwp9CgovLyBCRUdJTgovLyDQrdC90LQg0YTRg9C90LrRhiDQt9Cw0YDQsNC70LYg0LDRiNC40LPQu9Cw0LYg0LHQvtC70L3QvgoKYm9hcmQgZmxpcDEoYm9hcmQgYSwgYm9vbCB6ID0gMSkgewoJYm9hcmQgYjsKCXJlcChpLCBqKSB7CgkJaWYgKHopIGJbaV1bal0gPSBhW2pdW2ldOwoJCWVsc2UgYltpXVtqXSA9IGFbMyAtIGpdWzMgLSBpXTsKCX0KCXJldHVybiBiOwp9CgoKYm9hcmQgZGlyMShib2FyZCBhLCBjaGFyIGMpIHsKCWlmIChjID09ICdVJykgcmV0dXJuIGE7CglpZiAoYyA9PSAnTCcpIHJldHVybiBmbGlwMShhKTsKCWlmIChjID09ICdSJykgcmV0dXJuIGZsaXAxKGEsIDApOwoJcmV0dXJuIGZsaXAxKGZsaXAxKGEsIDApKTsKfQoKYm9hcmQgbW92ZTEoYm9hcmQgYSwgY2hhciBjKSB7CglhID0gZGlyMShhLCBjKTsKCXJlcChqLCBpKSB7CgkJaWYgKGFbaV1bal0gPT0gMCkgY29udGludWU7CgkJZm9yIChpbnQgayA9IGkgKyAxOyBrIDwgNDsgaysrKSB7CgkJCWlmIChhW2tdW2pdID09IDApIGNvbnRpbnVlOwoJCQlpZiAoYVtpXVtqXSA9PSBhW2tdW2pdKSB7CgkJCQlhW2ldW2pdICo9IC0yOwoJCQkJYVtrXVtqXSA9IDA7CgkJCX0KCQkJYnJlYWs7CgkJfQoJfQoJcmVwKGksIGopIGlmIChhW2ldW2pdIDwgMCkgYVtpXVtqXSA9IC1hW2ldW2pdOwoJcmVwKGosIGkpIHsKCQlpZiAoYVtpXVtqXSA+IDApIGNvbnRpbnVlOwoJCWZvciAoaW50IGsgPSBpICsgMTsgayA8IDQ7IGsrKykgewoJCQlpZiAoYVtrXVtqXSA+IDApIHsKCQkJCWFbaV1bal0gPSBhW2tdW2pdOwoJCQkJYVtrXVtqXSA9IDA7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCWEgPSBkaXIxKGEsIGMpOwoJcmV0dXJuIGE7Cn0KCmJvb2wgb3Zlcihib2FyZCBhLCBjaGFyIGMpewogICAgYm9hcmQgYjsKICAgIGIgPSBtb3ZlMShhLGMpOwogICAgcmVwKGksail7CiAgICAgICAgaWYoYVtpXVtqXSE9YltpXVtqXSl7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKaW50IGZpbmRfc3VtKGJvYXJkIGEsIGNoYXIgYyl7CiAgICBib2FyZCBiOwogICAgaW50IHM9MDsKICAgIGIgPSBtb3ZlMShhLGMpOwogICAgcmVwKGksail7CiAgICAgICAgaWYoYltpXVtqXT09MCl7CiAgICAgICAgICAgIHMrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gczsKfQoKY2hhciBwbGF5KGJvYXJkIGEpIHsKCiAgICBpbnQgc3VtX3VwLHN1bV9kb3duLHN1bV9sZWZ0LHN1bV9yaWdodDsKCiAgICBpZihvdmVyKGEsJ1UnKSl7CiAgICAgICAgc3VtX3VwPS0xOwogICAgfSBlbHNlewogICAgICAgIHN1bV91cD1maW5kX3N1bShhLCdVJyk7CiAgICB9CiAgICBpZihvdmVyKGEsJ0QnKSl7CiAgICAgICAgc3VtX2Rvd249LTE7CiAgICB9IGVsc2V7CiAgICAgICAgc3VtX2Rvd249ZmluZF9zdW0oYSwnRCcpOwogICAgfQogICAgaWYob3ZlcihhLCdSJykpewogICAgICAgIHN1bV9yaWdodD0tMTsKICAgIH0gZWxzZXsKICAgICAgICBzdW1fcmlnaHQ9ZmluZF9zdW0oYSwnUicpOwogICAgfQogICAgaWYob3ZlcihhLCdMJykpewogICAgICAgIHN1bV9sZWZ0PS0xOwogICAgfSBlbHNlewogICAgICAgIHN1bV9sZWZ0PWZpbmRfc3VtKGEsJ0wnKTsKICAgIH0KCiAgICBpZihzdW1fdXA+c3VtX2xlZnQgJiYgc3VtX3VwPnN1bV9yaWdodCAmJiBzdW1fdXA+c3VtX2Rvd24pewogICAgICAgIHJldHVybiAnVSc7CiAgICB9CiAgICBpZihzdW1fZG93bj5zdW1fbGVmdCAmJiBzdW1fZG93bj5zdW1fcmlnaHQgJiYgc3VtX2Rvd24+c3VtX3VwKXsKICAgICAgICByZXR1cm4gJ0QnOwogICAgfQogICAgaWYoc3VtX3JpZ2h0PnN1bV9sZWZ0ICYmIHN1bV9yaWdodD5zdW1fZG93biAmJiBzdW1fcmlnaHQ+c3VtX3VwKXsKICAgICAgICByZXR1cm4gJ1InOwogICAgfQogICAgcmV0dXJuICdMJzsKfQoKLy8g0K3QvdC0INCx0LjRh9GB0Y3QvSDRhdGN0YHQs9GN0Y0g0Lsg0YHQtdGA0LLRjdGA0YIg0LjQu9Cz0Y3RjdC90Y0KLy8gRU5ECgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCXN0cmluZyB0b2tlbjsKCWlmIChhcmdjID09IDIpIHRva2VuID0gYXJndlsxXTsKCXNyYW5kKDI0Nyk7CglzcmFuZCh0aW1lKDApKTsKCWJvYXJkIGE7IHJlcChpLCBqKSBhW2ldW2pdID0gMDsKCglpbnQgaXRyID0gMDsKCWNsb2NrX3QgYmVnaW4gPSBjbG9jaygpOwoJd2hpbGUgKHRydWUpIHsKCQljaGFyIGMgPSBwbGF5KGEpOwoJCXJlcChpLCBqKSBjb3V0IDw8IGFbaV1bal0gPDwgIiBcbiJbaiA9PSAzXTsKCQljb3V0IDw8IGMgPDwgIlxuIjsKCQlpZiAoYyAhPSAnVScgJiYgYyAhPSAnUicgJiYgYyAhPSAnRCcgJiYgYyAhPSAnTCcpIGJyZWFrOwoJCWJvYXJkIGIgPSBtb3ZlKGEsIGMpOwoJCWlmIChpdHIgPiAwICYmIGIgPT0gYSkgYnJlYWs7CgkJYSA9IHB1dChiKTsKCQlkb3VibGUgdGltZXIgPSBkb3VibGUoY2xvY2soKSAtIGJlZ2luKSAvIENMT0NLU19QRVJfU0VDOwoJCWlmICh0aW1lciA+IDEwKSBicmVhazsKCQlpdHIrKzsKCX0KCWludCBzY29yZSA9IDA7CglyZXAoaSwgaikgc2NvcmUgKz0gYVtpXVtqXTsKCWNvdXQgPDwgIlNjb3JlOiAiIDw8IHNjb3JlIDw8IGVuZGw7Cgljb3V0IDw8ICJMYXN0IHN0YXRlOlxuIjsKCXJlcChpLCBqKSBjb3V0IDw8IGFbaV1bal0gPDwgIiBcbiJbaiA9PSAzXTsKCWRvdWJsZSB0aW1lciA9IGRvdWJsZShjbG9jaygpIC0gYmVnaW4pIC8gQ0xPQ0tTX1BFUl9TRUM7Cgljb3V0IDw8ICJUaW1lOiAiIDw8IChpbnQpdGltZXIgPDwic2VjXG4iOwoJcmV0dXJuIDA7Cn0=