문제(출처: https://www.acmicpc.net/problem/6146)
< 신아를 만나러 >
문제 풀이
bfs 탐색을 통해 웅덩이를 제외한 곳을 방문하며 최소 거리를 구한다.
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 _6146_ { // 신아를 만나러
static int arr[][], x, y;
static boolean visited[][];
static int dx[] = { -1, 1, 0, 0 };
static int dy[] = { 0, 0, -1, 1 };
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
x = Integer.parseInt(st.nextToken()) + 500;
y = Integer.parseInt(st.nextToken()) + 500;
int n = Integer.parseInt(st.nextToken());
arr = new int[1001][1001];
visited = new boolean[1001][1001];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(bf.readLine());
int a = Integer.parseInt(st.nextToken()) + 500;
int b = Integer.parseInt(st.nextToken()) + 500;
visited[a][b] = true;
}
bfs();
}
private static void bfs() {
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] { 500, 500, 0 });
while (!queue.isEmpty()) {
int num[] = queue.poll();
for (int i = 0; i < 4; i++) {
int a = num[0] + dx[i];
int b = num[1] + dy[i];
if (Math.abs(a) <= 1001 && Math.abs(b) <= 1001 && !visited[a][b]) {
visited[a][b] = true;
if (a == x && b == y) {
System.out.println(num[2] + 1);
return;
}
queue.add(new int[] { a, b, num[2] + 1 });
}
}
}
}
}
Main
변수)
arr : 거리 저장
x, y : 집 위치
visited : 방문 여부
dx, dy : 상하좌우
- 집 위치(x, y), n 입력
- (a, b) 입력받아 방문 표시
- bfs 함수 호출
bfs
- queue에 [시작 위치 x, y, 거리] 추가
- queue가 빌 때까지 반복
: queue에서 값을 꺼내와 상하좌우로 이동
: 이동한 위치가 범위 안이며 아직 방문하지 않은 곳이라면 이동
: 이동한 위치가 집 위치라면 종료
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 19941_햄버거 분배 (0) | 2023.10.04 |
---|---|
[Baekjoon] 10709_기상캐스터 (1) | 2023.10.03 |
[Baekjoon] 15688_수 정렬하기 5 (0) | 2023.09.29 |
[Baekjoon] 1758_알바생 강호 (0) | 2023.09.28 |
[Baekjoon] 2012_등수 매기기 (0) | 2023.09.27 |