๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/16509)
< ์ฅ๊ตฐ >
๋ฌธ์ ํ์ด
bfs๋ฅผ ํ์ฉํ์ฌ ์ํ์ข์ฐ๋ก ์ด๋ ํ ๋๊ฐ์ ์ผ๋ก ์ด๋ํ ๋ ์กฐ๊ฑด์ ์ค์ ํด ์ค๋ค.
1. ์ฅ๊ธฐํ ๋ฒ์ ์์ธ์ง ํ์ธ
2. ๋๊ฐ์ ์ผ๋ก ์ด๋ํ๋ ๊ธธ์ ๋ค๋ฅธ ๊ธฐ๋ฌผ์ด ์๋์ง ํ์ธ
3. ๋ฐฉ๋ฌธ ์ฌ๋ถ ํ์ธ
4. ์์ ์์น์ธ์ง ํ์ธ
์์ ๊ฐ์ด 4๊ฐ์ง์ ์กฐ๊ฑด์ ์ค์ ํด ์ฃผ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class _16509_ {
static int dx[] = { -1, 0, 1, 0 }; // ์ ์ฐ ํ ์ข
static int dy[] = { 0, 1, 0, -1 };
static int dx2[] = { -1, -1, -1, 1, 1, 1, 1, -1 }; // ๋๊ฐ์
static int dy2[] = { -1, 1, 1, 1, 1, -1, -1, -1 };
static int r2, c2, result;
static boolean visited[][];
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
visited = new boolean[10][9];
result = -1;
// ์์ ์์น
int r1 = Integer.parseInt(st.nextToken());
int c1 = Integer.parseInt(st.nextToken());
// ์์ ์์น
st = new StringTokenizer(bf.readLine());
r2 = Integer.parseInt(st.nextToken());
c2 = Integer.parseInt(st.nextToken());
bfs(r1, c1, 0);
System.out.println(result);
}
private static void bfs(int r1, int c1, int depth) {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] { r1, c1, depth });
visited[r1][c1] = true;
while (!queue.isEmpty()) {
int temp[] = queue.poll();
int num = 0;
for (int i = 0; i < 4; i++) {
int x = temp[0] + dx[i];
int y = temp[1] + dy[i];
if (x >= 0 && x < 10 && y >= 0 && y < 9 ) { // ์ฅ๊ธฐํ ๋ฒ์ ์
for (int j = num; j < num+2; j++) {
if (x + (dx2[j] * 2) >= 0 && x + (dx2[j] * 2) < 10 && y + (dy2[j] * 2) >= 0
&& y + (dy2[j] * 2) < 9) { // ์ฅ๊ธฐํ ๋ฒ์ ์
if (x + dx2[j] == r2 && y + dy2[j] == c2) // ๋ค๋ฅธ ๊ธฐ๋ฌผ์ด ์์ผ๋ฉด ์ด๋ x
continue;
if (visited[x + (dx2[j] * 2)][y + (dy2[j] * 2)])
continue;
if (x + (dx2[j] * 2) == r2 && y + (dy2[j] * 2) == c2) {
result = temp[2] + 1;
break;
}
visited[x + (dx2[j] * 2)][y + (dy2[j] * 2)] = true;
queue.add(new int[] { x + (dx2[j] * 2), y + (dy2[j] * 2), temp[2] + 1 });
}
}
if (result > -1)
break;
}
num += 2;
}
if (result > -1)
break;
}
}
}
Main
- visited : ๋ฐฉ๋ฌธ ์ฌ๋ถ
- result: ์ต์ ์ด๋ ํ์
- ์์ ์์น์ ์์ ์์น ์ ๋ ฅ ํ bfs ํธ์ถ
bfs
- queue์ {x ์ขํ, y ์ขํ, ๋ฐฉ๋ฌธ ์} ์ ์ฅ ๋ฐ ๋ฐฉ๋ฌธ ํ์
- queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต -> ์ํ์ข์ฐ๋ก ์ด๋ํ์ฌ ์ฅ๊ธฐํ ๋ฒ์ ์์ด๋ฉด ๋๊ฐ์ ์ผ๋ก ์ด๋ -> ์ฅ๊ธฐํ ๋ฒ์ ์์ธ์ง ํ์ธ -> ๋ค๋ฅธ ๊ธฐ๋ฌผ์ด ์์ผ๋ฉด x ๋ฐ ๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด x -> ๋๊ฐ์ ์ผ๋ก ์ด๋ํ ์์น๊ฐ ์์ ์์น๋ผ๋ฉด ์ข ๋ฃ / ์์ ์์น๊ฐ ์๋๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ์ ๋ฐ queue์ ์ ์ฅ
์๊ฐ๐ค
๋๊ฐ์ ์ผ๋ก ์ด๋ํ์ ๋ ๋ฒ์ ์กฐ๊ฑด์ ์ ์ค์ ํด ์ฃผ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 17265_๋์ ์ธ์์๋ ์ํ๊ณผ ํจ๊ป (0) | 2023.05.30 |
---|---|
[Baekjoon] 14719_๋น๋ฌผ (0) | 2023.05.29 |
[Baekjoon] 14217_๊ทธ๋ํ ํ์ (0) | 2023.05.26 |
[Baekjoon] 1937_์์ฌ์์ด ํ๋ค (1) | 2023.05.25 |
[Baekjoon] 16954_์์ง์ด๋ ๋ฏธ๋ก ํ์ถ (0) | 2023.05.24 |