๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/6832)
< Maze >
๋ฌธ์ ํ์ด
bfs ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ์ฌ
+ : ์ํ์ข์ฐ
- : ์ข์ฐ
| : ์ํ
* : ์ด๋ ๋ถ๊ฐ
์ ๋ง๊ฒ ์ด๋ํ๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
public class _6832_ { // Maze
static int dx[] = { -1, 1, 0, 0 };
static int dy[] = { 0, 0, -1, 1 };
static char arr[][];
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(bf.readLine());
for (int i = 0; i < t; i++) {
int r = Integer.parseInt(bf.readLine());
int c = Integer.parseInt(bf.readLine());
arr = new char[r][c];
for (int j = 0; j < r; j++) {
String str = bf.readLine();
for (int k = 0; k < c; k++) {
arr[j][k] = str.charAt(k);
}
}
if (r == 1 && c == 1 && arr[0][0]!='*') {
bw.write("1\n");
} else {
bw.write(bfs() + "\n");
}
}
bw.flush();
}
private static int bfs() {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] { 0, 0, 1 });
boolean visited[][] = new boolean[arr.length][arr[0].length];
visited[0][0] = true;
while (!queue.isEmpty()) {
int temp[] = queue.poll();
if (arr[temp[0]][temp[1]] == '+') {
for (int k = 0; k < 4; k++) {
int x = temp[0] + dx[k];
int y = temp[1] + dy[k];
if (x >= 0 && x < arr.length && y >= 0 && y < arr[0].length && arr[x][y] != '*' && !visited[x][y]) {
if (x == arr.length - 1 && y == arr[0].length - 1) {
return temp[2] + 1;
}
visited[x][y] = true;
queue.add(new int[] { x, y, temp[2] + 1 });
}
}
} else if (arr[temp[0]][temp[1]] == '-') {
for (int k = 2; k < 4; k++) {
int x = temp[0] + dx[k];
int y = temp[1] + dy[k];
if (x >= 0 && x < arr.length && y >= 0 && y < arr[0].length && arr[x][y] != '*' && !visited[x][y]) {
if (x == arr.length - 1 && y == arr[0].length - 1) {
return temp[2] + 1;
}
visited[x][y] = true;
queue.add(new int[] { x, y, temp[2] + 1 });
}
}
} else if (arr[temp[0]][temp[1]] == '|') {
for (int k = 0; k < 2; k++) {
int x = temp[0] + dx[k];
int y = temp[1] + dy[k];
if (x >= 0 && x < arr.length && y >= 0 && y < arr[0].length && arr[x][y] != '*' && !visited[x][y]) {
if (x == arr.length - 1 && y == arr[0].length - 1) {
return temp[2] + 1;
}
visited[x][y] = true;
queue.add(new int[] { x, y, temp[2] + 1 });
}
}
}
}
return -1;
}
}
๋ณ์)
dx, dy : ์ด๋ ๋ฐฉํฅ
t : ํ ์คํธ ์ผ์ด์ค ๊ฐ์
r, c : ๋ฐฐ์ด ํฌ๊ธฐ
visited : ๋ฐฉ๋ฌธ ์ฌ๋ถ
ํ ์คํธ ์ผ์ด์ค ์๋ฅผ ์ ๋ ฅ๋ฐ์ ํ ์คํธ ์ผ์ด์ค ์๋งํผ ๋ค์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
1) ๋ฐฐ์ด ํฌ๊ธฐ ์ ๋ ฅ
2) ๋ฐฐ์ด ํฌ๊ธฐ๋งํผ ๋ฐฐ์ด ์ ๋ณด ์ ๋ ฅ๋ฐ์ arr์ ์ ์ฅ
3) ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ 1x1์ด๊ณ ๊ฐ์ด *๋ผ๋ฉด -1 ์ถ๋ ฅ, *๊ฐ ์๋๋ผ๋ฉด 1 ์ถ๋ ฅ
4) ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ 1x1์ด ์๋๋ผ๋ฉด bfs ํจ์ ๋ฐํ๊ฐ ์ถ๋ ฅ
bfs()
Queue์ ์์ ์์น์ ์ด๋ ํ์๋ฅผ ์ ์ฅํ๋ค. ์์ ์์น๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌํ๋ค. Queue๊ฐ ๋น ๋๊น์ง ๋ค์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
1) Queue poll
2) ํ์ฌ ๊ฐ์ด +๋ผ๋ฉด ์ํ์ข์ฐ๋ก ์ด๋ํ์ฌ ๋ฐฐ์ด ๋ฒ์ ์์ด๊ณ ๊ฐ์ด *์ด ์๋๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ๋ฐ queue์ ์ถ๊ฐ. ๋์ฐฉ์์น๋ผ๋ฉด temp[2]+1 ๋ฐํ
3) ํ์ฌ ๊ฐ์ด -๋ผ๋ฉด ์ข์ฐ๋ก ์ด๋ํ์ฌ ๋ฐฐ์ด ๋ฒ์ ์์ด๊ณ ๊ฐ์ด *์ด ์๋๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ๋ฐ queue์ ์ถ๊ฐ. ๋์ฐฉ์์น๋ผ๋ฉด temp[2]+1 ๋ฐํ
4) ํ์ฌ ๊ฐ์ด |๋ผ๋ฉด ์ํ๋ก ์ด๋ํ์ฌ ๋ฐฐ์ด ๋ฒ์ ์์ด๊ณ ๊ฐ์ด *์ด ์๋๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ๋ฐ queue์ ์ถ๊ฐ. ๋์ฐฉ์์น๋ผ๋ฉด temp[2]+1 ๋ฐํ
๋์ฐฉ ์์น๊น์ง ์ด๋ํ ์ ์๋ค๋ฉด -1 ๋ฐํ
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 5462_POI (0) | 2024.11.26 |
---|---|
[Baekjoon] 6191_Cows on Skates (0) | 2024.11.25 |
[Baekjoon] 14145_ลฝetva (0) | 2024.11.21 |
[Baekjoon] 6004_The Chivalrous Cow (1) | 2024.11.20 |
[Baekjoon] 6601_Knight Moves (0) | 2024.11.19 |