(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;
}
}
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
Post a Comment