(UVA) 439 - Knight Moves - Solução

Utilizado o mesmo algoritmo que no problema Duende do SPOJ.
Utilizada Busca em Largura.

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(int[][] mapa, int pontoPartidaL, int pontoPartidaC) {
        int numLinhas = 8;
        int numColunas = 8;
        int[][] matriz = new int[numLinhas][numColunas];
               
        for (int i = 0; i < numLinhas; i++) {
            for (int j = 0; j < numColunas; j++) {
                matriz[i][j] = 0;
            }
        }
       
        ArrayList<Posicao> filaVisitados = new ArrayList<Posicao>();
       
        filaVisitados.add(new Posicao(pontoPartidaL, pontoPartidaC));
       
        int lin = 0;
        int col = 0;
       
        int[] vetorLinha = {-2,+2,-2,+2,-1,+1,-1,+1};
        int[] vetorColuna = {-1,-1,+1,+1,-2,-2,+2,+2};       
        int inicioFila = 0;
        while (filaVisitados.size() != inicioFila) {
            lin = filaVisitados.get(inicioFila).linha;
            col = filaVisitados.get(inicioFila).coluna;
           
            for (int i = 0; i < 8; 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) {
                        matriz[nLinha][nColuna] = matriz[lin][col]+1;
                        if (mapa[nLinha][nColuna] == 1) { // onde quero chegar
                            return matriz[nLinha][nColuna];
                        }
                        else {
                            filaVisitados.add(new Posicao(nLinha, nColuna));;
                        }
                    }
                }
            }
           
            inicioFila++;
        }   
       
        return matriz[lin][col]+1;
    }
   
    void processa() throws NumberFormatException, IOException {
        String line = "";
       
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        while ((line = br.readLine()) != null) {
            String pos1 = line.charAt(0) + "" + line.charAt(1);
            String pos2 = line.charAt(3) + "" + line.charAt(4);
            int pontoPartidaL = line.charAt(0)-'a';
            int pontoPartidaC = line.charAt(1)-'0'-1;
            int pontoChegadaL = line.charAt(3)-'a';
            int pontoChegadaC = line.charAt(4)-'0'-1;

            int[][] tabuleiro = new int[8][8];
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    if ((i == pontoChegadaL) && (j == pontoChegadaC)) {
                        tabuleiro[i][j] = 1;   // onde chegar 
                    }
                    else {
                        tabuleiro[i][j] = 0;
                    }
                }   
            }
           
            if (pos1.equals(pos2)) {
                System.out.println("To get from " + pos1 + " to " + pos2 + " takes 0 knight moves.");
            }
            else {           
                int resposta = busca(tabuleiro, pontoPartidaL, pontoPartidaC);
               
                System.out.println("To get from " + pos1 + " to " + pos2 + " takes " + resposta + " knight moves.");
            }
        }
       
        return;
    }
}

Comments

Popular posts from this blog

(Coderbyte) Powers of Two - Solução

(Coderbyte) Dash Insert II - Solução

(CoderByte) Number Search - Solução