알고리즘/백준
6593_상범 빌딩
베리영young
2024. 5. 27. 06:01
사용 알고리즘: bfs
사용 언어: java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main_bj_6593_상범빌딩 {
static int[] dl = {0,0,0,0,1,-1};
static int[] dr = {-1,1,0,0,0,0};
static int[] dc = {0,0,-1,1,0,0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String string = "";
while (true) {
StringTokenizer st = new StringTokenizer(br.readLine());
int l = Integer.parseInt(st.nextToken());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
if(l==0 && r==0 && c==0) break;
int[] s = new int[] {0,0,0};
int[] e = new int[] {0,0,0};
char[][][] building = new char[l][r][c];
for (int i = 0; i < l; i++) {
for (int j = 0; j < r; j++) {
string = br.readLine();
for (int k = 0; k < c; k++) {
building[i][j][k] = string.charAt(k);
if (building[i][j][k]=='S') {
s = new int[]{i, j, k};
}
if (building[i][j][k]=='E') {
e = new int[]{i, j, k};
}
}
}
br.readLine(); //허
}
int moves = escapeBuilding(building, s, e, l,r,c);
if(moves > -1) {
System.out.println("Escaped in "+ moves +" minute(s).");
}
else {
System.out.println("Trapped!");
}
}
}
private static int escapeBuilding(char[][][] building, int[] s, int[] e,
int l, int r, int c) {
int moves = -1;
boolean[][][] visited = new boolean[l][r][c];
visited[s[0]][s[1]][s[2]] = true;
Queue<int[]> q = new ArrayDeque<>();
q.add(new int[] {s[0], s[1], s[2], 0});
while (!q.isEmpty()) {
int[] p = q.poll();
if (p[0] == e[0] && p[1] == e[1] && p[2] == e[2]) {
return p[3];
}
for (int d = 0; d < 6; d++) {
int nl = p[0] + dl[d];
int nr = p[1] + dr[d];
int nc = p[2] + dc[d];
if(nl>=0 && nl < l &&
nr>=0 && nr < r && nc>=0 && nc <c) {
if(!visited[nl][nr][nc] && building[nl][nr][nc] != '#') {
visited[nl][nr][nc] = true;
q.add(new int[] {nl, nr, nc, p[3]+1});
}
}
//
}
}
return moves;
}
}
화나는 포인트:
논리가 틀리고 뭐고 하기 전에, 자꾸 말도 안 되는 런타임 에러가 뜨길래 뭔가 싶었다.
인풋이 이런 식이었다.
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
보다 싶이, 층 마다 한 줄씩 띄어야 한다... 저거 고치니까 바로 맞았다!