pesquisa

URI PROBLEMA 1559 - 2048 SOLUÇÃO EM C++

URI Online Judge | 1559

2048

Por Gabriel Dalalio, ITA BR Brazil
Timelimit: 1
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';
    }
}

Postar um comentário

0 Comentários