(UVA) 572 - Oil Deposits - Solução

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

class Main {
    class Posicao {
        public Posicao(int l, int c) {
                linha = l;
                coluna = c;
            }
        public int linha;
        public int coluna;
    }

    public static void main(String[] args) throws NumberFormatException, IOException {
        Main processando = new Main();
        processando.processa();
       
        System.exit(0);
    }
   
    int[][] busca(char[][] mapa, ArrayList<Posicao> filaVisitar, int pontoPartidaL, int pontoPartidaC, int numLinhas, int numColunas) {
        int[][] matriz = new int[numLinhas][numColunas];
               
        for (int i = 0; i < numLinhas; i++) {
            for (int j = 0; j < numColunas; j++) {
                matriz[i][j] = 0;
            }
        }
       
        int lin = 0;
        int col = 0;
               
        ArrayList<Posicao> filaVisitados = new ArrayList<Posicao>();
        filaVisitados.add(new Posicao(pontoPartidaL, pontoPartidaC));
       
        int[] vetorLinha = {0,0,+1,-1,-1,+1,-1,+1,0};
        int[] vetorColuna = {-1,+1,0,0,-1,-1,+1,+1,0};       
        int inicioFila = 0;
        int contador = 1;
        int contador2 = 0;
        boolean incrementou = false;
        while (filaVisitados.size() != inicioFila) {
            lin = filaVisitados.get(inicioFila).linha;
            col = filaVisitados.get(inicioFila).coluna;
           
            for (int i = 0; i < 9; i++) {
                int nLinha = lin+vetorLinha[i];
                int nColuna = col+vetorColuna[i];
                if (nLinha >= 0 && nLinha < numLinhas && nColuna >= 0 && nColuna < numColunas) {
                    if (matriz[nLinha][nColuna] == 0) {
                        if (mapa[nLinha][nColuna] == '@') {
                            incrementou = true;
                            matriz[nLinha][nColuna] = contador;
                            filaVisitados.add(new Posicao(nLinha, nColuna));
                        }
                    }
                }
            }
            inicioFila++;
            if (filaVisitar.size() > 0 && contador2 < filaVisitar.size() && filaVisitados.size() == inicioFila) {
                filaVisitados.add(filaVisitar.get(contador2));
                if (incrementou) {
                    contador++;
                    incrementou = false;
                }
                contador2++;
            }
        }    
               
        return matriz;
    }
   
    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 numLinhas = Integer.valueOf(tokenizer.nextToken());
            int numColunas = Integer.valueOf(tokenizer.nextToken());
                       
            if (numLinhas == 0 && numColunas == 0) {
                return;
            }
                            
            char[][] mapa = new char[numLinhas][numColunas];
                   
            int pontoPartidaL = 0;
            int pontoPartidaC = 0;
            ArrayList<Posicao> filaVisitar = new ArrayList<Posicao>();
            for (int j = 0; j < numLinhas; j++) {
                line = br.readLine();
                for (int k = 0; k < numColunas; k++) {
                    mapa[j][k] = line.charAt(k);
                    if (mapa[j][k] == '@') {
                        pontoPartidaL = j;
                        pontoPartidaC = k;
                        filaVisitar.add(new Posicao(pontoPartidaL, pontoPartidaC));
                    }
                }   
            }

            int[][] resposta = busca(mapa, filaVisitar, pontoPartidaL, pontoPartidaC, numLinhas, numColunas);

            int maior = 0;
            for (int j = 0; j < numLinhas; j++) {
                for (int k = 0; k < numColunas; k++) {
                    if (resposta[j][k] > maior) {
                        maior = resposta[j][k];
                    }
                }   
            }
           
            System.out.println(maior);
        }
                   
        return;
    }
}

Comments

Popular posts from this blog

(Coderbyte) Powers of Two - Solução

(Coderbyte) Dash Insert II - Solução

(CoderByte) Number Search - Solução