๋ฌธ์
https://www.acmicpc.net/problem/5427
5427๋ฒ: ๋ถ
์๊ทผ์ด๋ ๋น ๊ณต๊ฐ๊ณผ ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฑด๋ฌผ์ ๊ฐํ์๋ค. ๊ฑด๋ฌผ์ ์ผ๋ถ์๋ ๋ถ์ด ๋ฌ๊ณ , ์๊ทผ์ด๋ ์ถ๊ตฌ๋ฅผ ํฅํด ๋ฐ๊ณ ์๋ค. ๋งค ์ด๋ง๋ค, ๋ถ์ ๋์๋จ๋ถ ๋ฐฉํฅ์ผ๋ก ์ธ์ ํ ๋น ๊ณต๊ฐ์ผ๋ก ํผ์ ธ๋๊ฐ๋ค. ๋ฒฝ์
www.acmicpc.net
ํ์ด
์ ํ์ ์ธ BFS ์๋ฎฌ๋ ์ด์ ๋ฌธ์ !
๋ชจ๋ ๋ก์ง์ ์์์ ๋ถ์ด ๋ฒ์ง๋ ๊ณผ์ ๋ง ๊ผผ๊ผผํ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
BFS ๋ก์ง ์์
1. Depth๊ฐ ๋์ด๋ ๋ ๋ง๋ค ๋ถ ํ์ฐ
2. ๊ฐ๋ ค๋ ๊ธธ์ ๋ถ์ด ์์ผ๋ฉด Continue
3. ์ข ๋ฃ ์กฐ๊ฑด ํ์ธ
4. ์๊ทผ์ด ์ด๋ ๊ฐ๋ฅ ๊ฒฝ๋ก ํ์
๋ถ์ด ๋ฒ์ง๋ ๊ณผ์
1. ๋ถ์ด ์๋ก ๋ฒ์ง ๊ณณ์ ์ ์ฅํ ๋ฆฌ์คํธ ์ ์ธ
2. ํ์ฌ ๋ถ ๋ฆฌ์คํธ๋ฅผ ๋๋ฉฐ ์๋ก ๋ฒ์ง ๋ฆฌ์คํธ์ ์ถ๊ฐ
3. ํ์ฌ ๋ถ ๋ฆฌ์คํธ๋ฅผ ์ด๊ธฐํ: ์ด์ฐจํผ ์ด๋ฏธ ๋ฒ์ง ๊ณณ์ด๊ธฐ ๋๋ฌธ์ -> ์๊ฐ ์ด๊ณผ ์กฐ์ฌ ใ _ใ
4. ์๋ก ๋ฒ์ง ๋ฆฌ์คํธ๋ฅผ ๊ธฐ์กด ๋ฆฌ์คํธ์ ์ถ๊ฐ
์ฝ๋ (JAVA)
import java.io.*;
import java.util.*;
public class Main{
static int[] di = {-1,0,1,0}; // ์ ์ข ํ ์ฐ
static int[] dj = {0,-1,0,1};
static int N, M, res;
static char[][] map;
static List<int[]> fire;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int tc = 0 ; tc < T ; tc++){
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
map = new char[N][M];
fire = new ArrayList<>();
int[] cur = new int[2];
for(int i =0 ; i < N ; i++){
String str = br.readLine();
for(int j =0 ; j < M ; j++){
map[i][j] = str.charAt(j);
if(map[i][j] == '*'){
fire.add(new int[]{i, j});
}
else if(map[i][j] == '@'){
cur[0] = i; cur[1] = j;
map[i][j] = '.';
}
}
}
res = -1;
findWay(cur[0], cur[1]);
System.out.println((res==-1)?"IMPOSSIBLE":res);
}
}
private static void findWay(int i, int j) {
Queue<int[]> q = new ArrayDeque<>();
int time = 0;
boolean[][] visited = new boolean[N][M];
q.offer(new int[]{i, j, 0});
visited[i][j] = true;
while(!q.isEmpty()){
int[] cur = q.poll();
/*
1. depth ๋์ด๋ ๋๋ง๋ค ๋ถ ํ์ฐ: ํด์ฃผ์ง ์์ผ๋ฉด ๊ฐ์ ์ด์์๋ ๊ณ์ ๋ถ์ด ํ์ฐ๋๋ ์ํฉ ๋ฐ์
*/
if(time != cur[2]){
spreadFire();
time = cur[2];
}
/*
2. ๊ฐ๋ ค๋ ๊ธธ์ ๋ถ์ด ํ์ฐ๋์ด ์์ผ๋ฉด ๋ค์ ๊ฒฝ๋ก ํ์
*/
if(map[cur[0]][cur[1]] == '*') continue;
/*
3. ์ข
๋ฃ ์กฐ๊ฑด ์ฒดํฌ
*/
if(cur[0] == 0 || cur[0] == N-1 || cur[1] == 0 || cur[1] == M-1){
res = cur[2]+1; // ๊ฑด๋ฌผ ๋ฐ์ผ๋ก ๋๊ฐ๋ ์๊ฐ๊น์ง +1
return;
}
/*
์๊ทผ์ด ์ด๋ ๊ฐ๋ฅ ๊ฒฝ๋ก ํ์
*/
for(int d = 0; d < 4 ; d ++){
int ni = cur[0] + di[d];
int nj = cur[1] + dj[d];
if(0<=ni&&ni<N && 0<=nj&&nj<M){
if(!visited[ni][nj] && map[ni][nj] == '.'){
visited[ni][nj] = true;
q.offer(new int[]{ni, nj, cur[2]+1});
}
}
}
}
}
private static void spreadFire() {
List<int[]> tmp = new ArrayList<>();
for(int[] f: fire){
for(int d = 0 ; d < 4 ; d++){
int ni = f[0] + di[d];
int nj = f[1] + dj[d];
if(0<=ni&&ni<N && 0<=nj&&nj<M){
if(map[ni][nj] == '.'){
map[ni][nj] = '*';
tmp.add(new int[]{ni, nj});
}
}
}
}
fire.clear();
fire.addAll(tmp);
}
}
'๐ ์๊ณ ๋ฆฌ์ฆ > GraphTraversal' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 14466๋ฒ: ์๊ฐ ๊ธธ์ ๊ฑด๋๊ฐ ์ด์ 6 (JAVA) (0) | 2022.03.28 |
---|---|
[๋ฐฑ์ค] 3184๋ฒ ์ (Java) (0) | 2022.02.16 |
[๋ฐฑ์ค] 2606๋ฒ ๋ฐ์ด๋ฌ์ค (Java) (0) | 2021.08.24 |
[๋ฐฑ์ค] 2667๋ฒ ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (Java) (0) | 2021.08.24 |
[๋ฐฑ์ค] 10026๋ฒ ์ ๋ก์์ฝ(Java) (0) | 2021.08.20 |