티스토리 뷰
지훈이는 미로에서 일을 한다. 지훈이를 미로에서 탈출하도록 도와주자!
미로에서의 지훈이의 위치와 불이 붙은 위치를 감안해서 지훈이가 불에 타기전에 탈출할 수 있는지의 여부, 그리고 얼마나 빨리 탈출할 수 있는지를 결정해야한다.
지훈이와 불은 매 분마다 한칸씩 수평또는 수직으로(비스듬하게 이동하지 않는다) 이동한다.
불은 각 지점에서 네 방향으로 확산된다.
지훈이는 미로의 가장자리에 접한 공간에서 탈출할 수 있다.
지훈이와 불은 벽이 있는 공간은 통과하지 못한다.
입력
입력의 첫째 줄에는 공백으로 구분된 두 정수 R과 C가 주어진다. 단, 1 ≤ R, C ≤ 1000 이다. R은 미로 행의 개수, C는 열의 개수이다.
다음 입력으로 R줄동안 각각의 미로 행이 주어진다.
각각의 문자들은 다음을 뜻한다.
- #: 벽
- .: 지나갈 수 있는 공간
- J: 지훈이의 미로에서의 초기위치 (지나갈 수 있는 공간)
- F: 불이 난 공간
J는 입력에서 하나만 주어진다.
출력
지훈이가 불이 도달하기 전에 미로를 탈출 할 수 없는 경우 IMPOSSIBLE 을 출력한다.
지훈이가 미로를 탈출할 수 있는 경우에는 가장 빠른 탈출시간을 출력한다.
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main {
static int M, N, Answer;
static char[][] MAP;
static Queue<POINT> jq = new LinkedList<>();
static Queue<POINT> fq = new LinkedList<>();
static boolean[][] jVisited;
static boolean[][] fVisited;
static int[] dx = {-1,1,0,0};
static int[] dy = {0,0,-1,1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
M = sc.nextInt();
N = sc.nextInt();
MAP = new char[M][N];
jVisited = new boolean[M][N];
fVisited = new boolean[M][N];
for (int i = 0; i < M; i++) {
String str = sc.next();
MAP[i] = str.toCharArray();
}
// printMAP();
boolean tf = bfs();
if(tf)
System.out.println(Answer+1);
else
System.out.println("IMPOSSIBLE");
}
private static boolean bfs() {
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (MAP[i][j] == 'J') {
jq.offer(new POINT(i, j));
jVisited[i][j] = true;
}
if (MAP[i][j] == 'F') {
fq.offer(new POINT(i,j));
fVisited[i][j] = true;
}
}
}
while(!jq.isEmpty()) {
int jsize = jq.size();
int fsize = fq.size();
//불시작
for(int i=0; i<fsize; i++) {
POINT fp = fq.poll();
for(int j=0; j<4; j++) {
int nextX = fp.x + dx[j];
int nextY = fp.y + dy[j];
if(nextX<0 || nextY<0||nextX>=M||nextY>=N) {
continue;
}
if(MAP[nextX][nextY]=='#')
continue;
if(fVisited[nextX][nextY])
continue;
fVisited[nextX][nextY] = true;
MAP[nextX][nextY] = 'F';
fq.offer(new POINT(nextX,nextY));
}
}
//System.out.println("불맵");
//printMAP();
//지훈시작
for(int i =0; i<jsize;i++) {
POINT jp = jq.poll();
for(int j=0; j<4; j++) {
int nextX = jp.x + dx[j];
int nextY = jp.y + dy[j];
if(nextX<0 || nextY<0||nextX>=M||nextY>=N) {
return true;
}
if(MAP[nextX][nextY]!='.')
continue;
if(jVisited[nextX][nextY])
continue;
jVisited[nextX][nextY]=true;
MAP[nextX][nextY] = 'J';
jq.offer(new POINT(nextX,nextY));
}
}
Answer++;
//System.out.println("지훈맵");
//printMAP();
}
return false;
}
private static void printMAP() {
for (int i = 0; i < M; i++) {
System.out.println();
for (int j = 0; j < N; j++) {
System.out.print(MAP[i][j]);
}
}
}
}
class POINT{
int x;
int y;
POINT(int x, int y){
this.x = x;
this.y = y;
}
}
'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글
[3190] 뱀 (0) | 2022.11.21 |
---|---|
[2661] 좋은수열 (0) | 2022.11.21 |
[2476] 주사위 게임 (0) | 2022.11.21 |
[2252] 줄 세우기 (0) | 2022.11.21 |
[2234] 성곽 (0) | 2022.11.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- BOJ1652
- BOJ2476
- 도시분할계획
- BOJ4179
- 백준온라인저지 #10819 #차이를최대로
- BOJ7576
- 트리순회
- BOJ2023
- BOJ2206
- BOJ2252
- 크루스칼
- 백준17352
- BOJ1697
- 알고리즘
- 벽부수고이동하기
- BOJ1929
- BOJ2661
- BOJ3190
- BOJ1916
- 2234
- BOJ2234
- 백준
- 4179
- BOJ1197
- BOJ1520
- 백준알고리즘
- BOJ1991
- Kruskal
- BOJ
- BOJ2146
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함