(UVA) 532 - Dungeon Master - Solução

import java.io.*;
import java.util.*;

class Main {
    class Posicao {
        public Posicao(int n, int l, int c) {
                nivel = n;
                linha = l;
                coluna = c;
            }
        public int nivel;
        public int linha;
        public int coluna;
    }
   
    public static void main(String[] args) throws NumberFormatException, IOException {
        Main processando = new Main();
        processando.processa();
       
        System.exit(0);
    }

    // Busca em largura   
    int busca(char[][][] mapa, int pontoPartidaI, int pontoPartidaJ, int pontoPartidaK, int numNivel, int numLinhas, int numColunas) {
        int[][][] matriz = new int[numNivel][numLinhas][numColunas];
               
        for (int i = 0; i < numNivel; i++) {     
            for (int j = 0; j < numLinhas; j++) {
                for (int k = 0; k < numColunas; k++) {
                    matriz[i][j][k] = 0;
                }
            }
        }
               
        ArrayList<Posicao> filaVisitados = new ArrayList<Posicao>();
       
        filaVisitados.add(new Posicao(pontoPartidaI, pontoPartidaJ, pontoPartidaK));
       
        int niv = 0;
        int lin = 0;
        int col = 0;
       
        // Quando muda de nível, não há mudnaça em linha nem em coluna
        int[] vetorNivel = {0,0,0,0,+1,-1};
        int[] vetorLinha = {0,0,+1,-1,0,0};
        int[] vetorColuna = {+1,-1,0,0,0,0};       

        int inicioFila = 0;
        while (filaVisitados.size() != inicioFila) {
            niv = filaVisitados.get(inicioFila).nivel;
            lin = filaVisitados.get(inicioFila).linha;
            col = filaVisitados.get(inicioFila).coluna;
                      
            for (int i = 0; i < 6; i++) {
                int nNivel = niv+vetorNivel[i];
                int nLinha = lin+vetorLinha[i];
                int nColuna = col+vetorColuna[i];
                if (nNivel >= 0 && nNivel < numNivel && nLinha >= 0 && nLinha < numLinhas && nColuna >= 0 && nColuna < numColunas) {
                    if (matriz[nNivel][nLinha][nColuna] == 0 && mapa[nNivel][nLinha][nColuna] != 'S' && mapa[nNivel][nLinha][nColuna] != '#') {
                        matriz[nNivel][nLinha][nColuna] = matriz[niv][lin][col]+1;
                        if (mapa[nNivel][nLinha][nColuna] == 'E') {
                            return matriz[nNivel][nLinha][nColuna];
                        }
                        else {
                            filaVisitados.add(new Posicao(nNivel, nLinha, nColuna));;
                        }
                    }
                }
            }
           
            inicioFila++;
        }   
       
        return 0;
    }
   
    void processa() throws NumberFormatException, IOException {
        String line = "";
       
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while ((line = br.readLine()) != null) {
            StringTokenizer tokenizer = new StringTokenizer(line);
            int qteNivel = Integer.valueOf(tokenizer.nextToken());
            int qteLinha = Integer.valueOf(tokenizer.nextToken());
            int qteColuna = Integer.valueOf(tokenizer.nextToken());
           
            if (qteNivel == 0 && qteLinha == 0 && qteColuna == 0) {
                return;
            }

            int inicioI = 0;
            int inicioJ = 0;
            int inicioK = 0;
            char[][][] matriz = new char[qteNivel][qteLinha][qteColuna];
            for (int i = 0; i < qteNivel; i++) {
                for (int j = 0; j < qteLinha; j++) {
                    line = br.readLine();
                    for (int k = 0; k < qteColuna; k++) {  
                        matriz[i][j][k] = line.charAt(k);
                        if (matriz[i][j][k] == 'S') {
                            inicioI = i;
                            inicioJ = j;
                            inicioK = k;
                        }
                    }
                }
                line = br.readLine();
            }
                       
            int resposta = busca(matriz, inicioI, inicioJ, inicioK, qteNivel, qteLinha, qteColuna);
           
            if (resposta > 0) {
                System.out.println("Escaped in " + resposta + " minute(s).");
            }
            else {
                System.out.println("Trapped!");
            }
        }
                               
        return;
    }
}

Comments

Popular posts from this blog

(Coderbyte) Powers of Two - Solução

(Coderbyte) Dash Insert II - Solução

(CoderByte) Number Search - Solução