(UVA) 10653 - Bombs! NO they are Mines!! - Solução

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

class Main {
    class Posicao {
        public Posicao (int l, int c) {
            linha = l;
            coluna = c;
        }
        int linha;
        int coluna;
    }
   
    public static void main(String[] args) throws NumberFormatException, IOException {
        Main processando = new Main();
        processando.processa();
       
        System.exit(0);
    }
   
    static int leitor(BufferedReader br) throws NumberFormatException, IOException {
        int n;
        int resp = 0;
        while (true) {
            n = br.read();
            if (n >= '0' && n <= '9') {
                break;
            }
        }
        while (true) {
            resp = resp*10 + n-'0';
            n = br.read();
            if (n < '0' || n > '9') {
                break;
            }
        }
        return resp;
    }
   
    int busca(char[][] mapa, Posicao inicio, Posicao fim, int linha, int coluna) {
        int[][] matrizVisitados = new int[linha][coluna];
        for (int i = 0; i < linha; i++) {
            for (int j = 0; j < coluna; j++) {
                matrizVisitados[i][j] = -1;
            }
        }
       
        ArrayList<Posicao> filaVisitados = new ArrayList<Posicao>();
        filaVisitados.add(new Posicao(inicio.linha, inicio.coluna));
        // marque s
        matrizVisitados[inicio.linha][inicio.coluna] = 0;
       
        int[] ladosLinha = {1,-1,0,0};
        int[] ladosColuna = {0,0,1,-1};
               
        int contador = 0;
        int lin = 0;
        int col = 0;
        int resposta = 0;
        while (filaVisitados.size() != contador) {
            if (filaVisitados.get(contador).linha == fim.linha && filaVisitados.get(contador).coluna == fim.coluna) {
                resposta = matrizVisitados[filaVisitados.get(contador).linha][filaVisitados.get(contador).coluna];
                break;
            }

            for (int j = 0; j < 4; j++) {
                lin = filaVisitados.get(contador).linha + ladosLinha[j];
                col = filaVisitados.get(contador).coluna + ladosColuna[j];
                if (lin >= 0 && lin < linha && col >= 0 && col < coluna && matrizVisitados[lin][col] == -1 && mapa[lin][col] != '#') {
                   
                    int lin2 = filaVisitados.get(contador).linha;
                    int col2 = filaVisitados.get(contador).coluna;
                    matrizVisitados[lin][col] = matrizVisitados[lin2][col2]+1;
                    resposta = matrizVisitados[lin][col];
                    filaVisitados.add(new Posicao(lin, col));                   
                }
            }
           
            contador++;
        }
       
        return resposta;
    }
   
    void processa() throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
       
        int linha = leitor(br);
        int coluna = leitor(br);
       
        while(linha != 0 || coluna != 0) {
            int linhasComBomba = leitor(br);
           
            char[][] mapa = new char[linha][coluna];
           
            for (int i = 0; i < linha; i++) {
                for (int j = 0; j < coluna; j++) {
                    mapa[i][j] = '0';
                }
            }
           
            for (int i = 0; i < linhasComBomba; i++) {
                int numDaLinha = leitor(br);
                int qteBombas = leitor(br);

                for (int j = 0; j < qteBombas; j++) {
                    int colunaDaBomba = leitor(br);
                   
                    mapa[numDaLinha][colunaDaBomba] = '#';
                }
            }
           
            int lin = leitor(br);
            int col = leitor(br);
            Posicao inicio = new Posicao(lin, col);
            lin = leitor(br);
            col = leitor(br);
            Posicao fim = new Posicao(lin, col);
           
            int resposta = busca(mapa, inicio, fim, linha, coluna);
                   
            bw.write(resposta+"\n");
           
            linha = leitor(br);
            coluna = leitor(br);
        }
       
        bw.flush();
        bw.close();           
        return;
    }
}

Comments

Popular posts from this blog

(Coderbyte) Dash Insert II - Solução

(Coderbyte) Run Length - Solução

(Coderbyte) Counting Minutes I - Solução