(UVA) 532 - Dungeon Master - Solução
import java.io.*;
import java.util.*;
class Main {
class Posicao {
public Posicao(int n, int l, int c) {
nivel = n;
linha = l;
coluna = c;
}
public int nivel;
public int linha;
public int coluna;
}
public static void main(String[] args) throws NumberFormatException, IOException {
Main processando = new Main();
processando.processa();
System.exit(0);
}
// Busca em largura
int busca(char[][][] mapa, int pontoPartidaI, int pontoPartidaJ, int pontoPartidaK, int numNivel, int numLinhas, int numColunas) {
int[][][] matriz = new int[numNivel][numLinhas][numColunas];
for (int i = 0; i < numNivel; i++) {
for (int j = 0; j < numLinhas; j++) {
for (int k = 0; k < numColunas; k++) {
matriz[i][j][k] = 0;
}
}
}
ArrayList<Posicao> filaVisitados = new ArrayList<Posicao>();
filaVisitados.add(new Posicao(pontoPartidaI, pontoPartidaJ, pontoPartidaK));
int niv = 0;
int lin = 0;
int col = 0;
// Quando muda de nível, não há mudnaça em linha nem em coluna
int[] vetorNivel = {0,0,0,0,+1,-1};
int[] vetorLinha = {0,0,+1,-1,0,0};
int[] vetorColuna = {+1,-1,0,0,0,0};
int inicioFila = 0;
while (filaVisitados.size() != inicioFila) {
niv = filaVisitados.get(inicioFila).nivel;
lin = filaVisitados.get(inicioFila).linha;
col = filaVisitados.get(inicioFila).coluna;
for (int i = 0; i < 6; i++) {
int nNivel = niv+vetorNivel[i];
int nLinha = lin+vetorLinha[i];
int nColuna = col+vetorColuna[i];
if (nNivel >= 0 && nNivel < numNivel && nLinha >= 0 && nLinha < numLinhas && nColuna >= 0 && nColuna < numColunas) {
if (matriz[nNivel][nLinha][nColuna] == 0 && mapa[nNivel][nLinha][nColuna] != 'S' && mapa[nNivel][nLinha][nColuna] != '#') {
matriz[nNivel][nLinha][nColuna] = matriz[niv][lin][col]+1;
if (mapa[nNivel][nLinha][nColuna] == 'E') {
return matriz[nNivel][nLinha][nColuna];
}
else {
filaVisitados.add(new Posicao(nNivel, nLinha, nColuna));;
}
}
}
}
inicioFila++;
}
return 0;
}
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 qteNivel = Integer.valueOf(tokenizer.nextToken());
int qteLinha = Integer.valueOf(tokenizer.nextToken());
int qteColuna = Integer.valueOf(tokenizer.nextToken());
if (qteNivel == 0 && qteLinha == 0 && qteColuna == 0) {
return;
}
int inicioI = 0;
int inicioJ = 0;
int inicioK = 0;
char[][][] matriz = new char[qteNivel][qteLinha][qteColuna];
for (int i = 0; i < qteNivel; i++) {
for (int j = 0; j < qteLinha; j++) {
line = br.readLine();
for (int k = 0; k < qteColuna; k++) {
matriz[i][j][k] = line.charAt(k);
if (matriz[i][j][k] == 'S') {
inicioI = i;
inicioJ = j;
inicioK = k;
}
}
}
line = br.readLine();
}
int resposta = busca(matriz, inicioI, inicioJ, inicioK, qteNivel, qteLinha, qteColuna);
if (resposta > 0) {
System.out.println("Escaped in " + resposta + " minute(s).");
}
else {
System.out.println("Trapped!");
}
}
return;
}
}
import java.util.*;
class Main {
class Posicao {
public Posicao(int n, int l, int c) {
nivel = n;
linha = l;
coluna = c;
}
public int nivel;
public int linha;
public int coluna;
}
public static void main(String[] args) throws NumberFormatException, IOException {
Main processando = new Main();
processando.processa();
System.exit(0);
}
// Busca em largura
int busca(char[][][] mapa, int pontoPartidaI, int pontoPartidaJ, int pontoPartidaK, int numNivel, int numLinhas, int numColunas) {
int[][][] matriz = new int[numNivel][numLinhas][numColunas];
for (int i = 0; i < numNivel; i++) {
for (int j = 0; j < numLinhas; j++) {
for (int k = 0; k < numColunas; k++) {
matriz[i][j][k] = 0;
}
}
}
ArrayList<Posicao> filaVisitados = new ArrayList<Posicao>();
filaVisitados.add(new Posicao(pontoPartidaI, pontoPartidaJ, pontoPartidaK));
int niv = 0;
int lin = 0;
int col = 0;
// Quando muda de nível, não há mudnaça em linha nem em coluna
int[] vetorNivel = {0,0,0,0,+1,-1};
int[] vetorLinha = {0,0,+1,-1,0,0};
int[] vetorColuna = {+1,-1,0,0,0,0};
int inicioFila = 0;
while (filaVisitados.size() != inicioFila) {
niv = filaVisitados.get(inicioFila).nivel;
lin = filaVisitados.get(inicioFila).linha;
col = filaVisitados.get(inicioFila).coluna;
for (int i = 0; i < 6; i++) {
int nNivel = niv+vetorNivel[i];
int nLinha = lin+vetorLinha[i];
int nColuna = col+vetorColuna[i];
if (nNivel >= 0 && nNivel < numNivel && nLinha >= 0 && nLinha < numLinhas && nColuna >= 0 && nColuna < numColunas) {
if (matriz[nNivel][nLinha][nColuna] == 0 && mapa[nNivel][nLinha][nColuna] != 'S' && mapa[nNivel][nLinha][nColuna] != '#') {
matriz[nNivel][nLinha][nColuna] = matriz[niv][lin][col]+1;
if (mapa[nNivel][nLinha][nColuna] == 'E') {
return matriz[nNivel][nLinha][nColuna];
}
else {
filaVisitados.add(new Posicao(nNivel, nLinha, nColuna));;
}
}
}
}
inicioFila++;
}
return 0;
}
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 qteNivel = Integer.valueOf(tokenizer.nextToken());
int qteLinha = Integer.valueOf(tokenizer.nextToken());
int qteColuna = Integer.valueOf(tokenizer.nextToken());
if (qteNivel == 0 && qteLinha == 0 && qteColuna == 0) {
return;
}
int inicioI = 0;
int inicioJ = 0;
int inicioK = 0;
char[][][] matriz = new char[qteNivel][qteLinha][qteColuna];
for (int i = 0; i < qteNivel; i++) {
for (int j = 0; j < qteLinha; j++) {
line = br.readLine();
for (int k = 0; k < qteColuna; k++) {
matriz[i][j][k] = line.charAt(k);
if (matriz[i][j][k] == 'S') {
inicioI = i;
inicioJ = j;
inicioK = k;
}
}
}
line = br.readLine();
}
int resposta = busca(matriz, inicioI, inicioJ, inicioK, qteNivel, qteLinha, qteColuna);
if (resposta > 0) {
System.out.println("Escaped in " + resposta + " minute(s).");
}
else {
System.out.println("Trapped!");
}
}
return;
}
}
Comments
Post a Comment