URI Online Judge | 1559
Timelimit: 1
2048
Por Gabriel Dalalio, ITA
Brazil

Esse ano, o jogo conhecido como 2048 se tornou muito popular na internet. Veja a seguir uma imagem do jogo:

As teclas direcionais são usadas para realizar jogadas (cima, baixo, esquerda e direita). A cada vez que uma tecla é pressionada, os blocos numerados tentam deslizar pela matriz caso haja espaço. No exemplo da imagem acima, se a tecla para esquerda for pressionada, 5 blocos irão se mover (8, 2, 16, 2, 32).
Além de tentar deslizar, blocos adjacentes com o mesmo número se juntam em um único bloco com um número dobrado caso tentem deslizar na direção certa. No exemplo da imagem acima, se a tecla para baixo for pressionada, dois blocos 2 irão se transformar em um bloco 4 e dois blocos 32 irão se transformar em um bloco 64.
Durante o jogo, além de fazer as jogadas, surgem aleatoriamente blocos na matriz com números iguais a potências de 2. O objetivo é fazer os blocos se juntarem para que um bloco com número 2048 seja formado. Quando isso acontece, o jogador vence o jogo e não é possível fazer mais jogadas.
Porém, também pode acontecer do jogador não ter mais jogadas possíveis antes de formar o número 2048. No exemplo da imagem, apertar a tecla para a direita não é uma jogada válida, pois nenhum bloco pode se mover ou se juntar a outro bloco.
Sua tarefa nesse problema é dizer quais são as jogadas válidas para uma determinada situação do jogo.
Entrada
A entrada é iniciada por uma linha que contém o número de casos de teste. Para cada caso de teste, a entrada consiste em 4 linhas contendo uma matriz quadrada de dimensão 4. Os números da matriz são iguais a 0 para indicar que não bloco na posição, ou são iguais a potências de 2 entre 2 e 2048 inclusive.
Saída
Para cada teste, a saída consiste de uma linha contendo todas as jogadas possíveis para a entrada. As jogadas são indicadas por DOWN (baixo), LEFT (esquerda), RIGHT (direita) e UP (cima). As jogadas devem ser escritas em ordem alfabética. Caso não haja nenhuma jogada possível, imprima NONE.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int v[4][4];
cin >> n;
while (n--)
{
int none = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
cin >> v[i][j];
if (v[i][j] == 2048) none = 1;
}
}
if (none)
{
cout << "NONE\n";
continue;
}
int down = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 3; ++j)
if ((v[j][i] != 0 && v[j + 1][i] == 0) || (v[j][i] == v[j + 1][i] && v[j][i])) down = 1;
if (down) {break;}
}
int left = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 1 ; j < 4; ++j)
{
if ((v[i][j - 1] == 0 && v[i][j] != 0) || (v[i][j - 1] == v[i][j] && v[i][j])) left = 1;
}
if (left) {break;}
}
int right = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 0 ; j < 3; ++j)
{
if ((v[i][j + 1] == 0 && v[i][j] != 0) || (v[i][j + 1] == v[i][j] && v[i][j])) right = 1;
}
if (right) {break;}
}
int up = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 3; ++j)
if ((v[j + 1][i] != 0 && v[j][i] == 0) || (v[j][i] == v[j + 1][i] && v[j][i])) up = 1;
if (up) {break;}
}
if (!down && !left && !right && !up) cout << "NONE";
int escrevi = 0;
if (down) cout << "DOWN", escrevi = 1;
if (left) {if(escrevi) cout << ' '; escrevi = 1;cout << "LEFT"; }
if (right) {if(escrevi) cout << ' '; escrevi = 1;cout << "RIGHT" ; }
if (up) {if(escrevi) cout << ' '; escrevi = 1;cout << "UP";}
cout << '\n';
}
}
using namespace std;
int main()
{
int n;
int v[4][4];
cin >> n;
while (n--)
{
int none = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
cin >> v[i][j];
if (v[i][j] == 2048) none = 1;
}
}
if (none)
{
cout << "NONE\n";
continue;
}
int down = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 3; ++j)
if ((v[j][i] != 0 && v[j + 1][i] == 0) || (v[j][i] == v[j + 1][i] && v[j][i])) down = 1;
if (down) {break;}
}
int left = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 1 ; j < 4; ++j)
{
if ((v[i][j - 1] == 0 && v[i][j] != 0) || (v[i][j - 1] == v[i][j] && v[i][j])) left = 1;
}
if (left) {break;}
}
int right = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 0 ; j < 3; ++j)
{
if ((v[i][j + 1] == 0 && v[i][j] != 0) || (v[i][j + 1] == v[i][j] && v[i][j])) right = 1;
}
if (right) {break;}
}
int up = 0;
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 3; ++j)
if ((v[j + 1][i] != 0 && v[j][i] == 0) || (v[j][i] == v[j + 1][i] && v[j][i])) up = 1;
if (up) {break;}
}
if (!down && !left && !right && !up) cout << "NONE";
int escrevi = 0;
if (down) cout << "DOWN", escrevi = 1;
if (left) {if(escrevi) cout << ' '; escrevi = 1;cout << "LEFT"; }
if (right) {if(escrevi) cout << ' '; escrevi = 1;cout << "RIGHT" ; }
if (up) {if(escrevi) cout << ' '; escrevi = 1;cout << "UP";}
cout << '\n';
}
}
0 Comentários