(UVA) 10336 - Rank the Languages - 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;
    }

    class Resultado {
        public char letra;
        public int vezes;
    }

    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, char caracteres, 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] = -1;
            }
        }
       
        int lin = 0;
        int col = 0;
               
        ArrayList<Posicao> filaVisitados = new ArrayList<Posicao>();
        filaVisitados.add(new Posicao(0, 0));
       
        int[] vetorLinha = {0,0,+1,-1,-1,+1,-1,+1};
        int[] vetorColuna = {-1,+1,0,0,-1,+1,+1,-1};       
        int inicioFila = 0;
        int contador = 0;
        int contador2 = 0;
        int contadorC = 0;
        boolean incrementou = false;
        while (filaVisitados.size() != inicioFila) {
            lin = filaVisitados.get(inicioFila).linha;
            col = filaVisitados.get(inicioFila).coluna;
           
            for (int i = 0; i < 4; i++) {
                int nLinha = lin+vetorLinha[i];
                int nColuna = col+vetorColuna[i];
                if (nLinha >= 0 && nLinha < numLinhas && nColuna >= 0 && nColuna < numColunas) {
                    if (matriz[nLinha][nColuna] == -1) {
                        if (mapa[nLinha][nColuna] == caracteres) {
                            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 contador;
    }
   
    void processa() throws NumberFormatException, IOException {
        String line = "";
       
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        line = br.readLine();
        StringTokenizer tokenizer = new StringTokenizer(line);
        int qteCasos = Integer.valueOf(tokenizer.nextToken());
       
        for (int i = 0; i < qteCasos; i++) {
            line = br.readLine();
            tokenizer = new StringTokenizer(line);
            int numLinhas = Integer.valueOf(tokenizer.nextToken());
            int numColunas = Integer.valueOf(tokenizer.nextToken());
                       
            char[][] mapa = new char[numLinhas][numColunas];
            int pontoPartidaL = 0;
            int pontoPartidaC = 0;
            ArrayList<Posicao> filaVisitar = new ArrayList<Posicao>();
            ArrayList<String> caracteres = new ArrayList<String>();
            for (int j = 0; j < numLinhas; j++) {
                line = br.readLine();
                for (int k = 0; k < numColunas; k++) {
                    mapa[j][k] = line.charAt(k);
                    if (!caracteres.contains(mapa[j][k]+"")) {
                        caracteres.add(mapa[j][k]+"");
                    }
                    filaVisitar.add(new Posicao(j, k));
                }   
            }
           
            Resultado[] resultado = new Resultado[caracteres.size()];
           
            for (int j = 0; j < caracteres.size(); j++) {
                resultado[j] = new Resultado();
            }
           
            int resposta = 0;
            System.out.println("World #" + (i+1));
            for (int j = 0; j < caracteres.size(); j++) {
                resposta = busca(mapa, filaVisitar, caracteres.get(j).charAt(0), numLinhas, numColunas);
                resultado[j].letra = caracteres.get(j).charAt(0);
                resultado[j].vezes = resposta; 
            }
           
            Arrays.sort(resultado, 0, caracteres.size(), new Comparator<Resultado>() {
                @Override
                public int compare(Resultado r1, Resultado r2)
                {
                    if (r1.vezes < r2.vezes) {
                        return +1;
                    }
                    else if (r1.vezes == r2.vezes) {
                        if (r1.letra < r2.letra) {
                            return -1;
                        }
                        else if (r1.letra == r2.letra) {
                            return 0;
                        }
                        else {
                            return +1;
                        }
                    }
                    else {
                        return -1;
                    }
                }
            });

            for (int j = 0; j < caracteres.size(); j++) {
                System.out.println(resultado[j].letra + ": " + resultado[j].vezes);
            }
        }
                   
        return;
    }
}

Comments

Popular posts from this blog

(Coderbyte) Powers of Two - Solução

(Coderbyte) Dash Insert II - Solução

(CoderByte) Number Search - Solução