Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 구슬탈출2
- 부분수열의 합
- 9095
- 미세먼지 안녕!
- 17143
- 장고
- Java
- 17136
- 백준
- 재귀
- 다리 만들기2
- 인스타
- django
- 연산자 끼워넣기
- 17472
- 17144
- 색종이 붙이기
- 14502
- 따라하기
- 좋아요
- 14888
- Ajax
- 댓글
- 인스타그램
- 1182
- 로또
- 6603
- 16637
- 괄호추가하기
- 알고리즘
Archives
- Today
- Total
Be a developer
백준 3055 탈출 본문
최소 거리를 구하는 문제이고, 한 칸 이동하는 것이 가중치 1이므로 bfs로 풀 수 있다.
먼저 물이 퍼지는 데 걸리는 시간을 dist 배열에 저장하고, 고슴도치가 이동하는 것을 따로 visit 배열에 저장한다.
즉, bfs를 두 번 돌린다.
계속 틀렸다고 나오는 데 무슨 문제인지는 잘 모르겠지만, 조건을 걸러 내는 것이 매우 까다로운 문제인 것 같다.
조건을 통해 queue에 넣을 조건을 잘 거르는 것이 중요한 문제인 것 같다.
매우 짜증나게 시간 오래 잡아먹음
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
char maze[50][50];
int dist[50][50];
int visit[50][50];
int dr[4] = { -1,0,1,0 };
int dc[4] = { 0,1,0,-1 };
int main(int argc, char** argv) {
int r, c, s_r, s_c, d_r, d_c;
cin >> r >> c;
queue<pair<int, int>> q;
//고슴도치가 이동한 거리를 저장할 수 있도록 tuple로 저장
queue<pair<int,int>> qq;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
dist[i][j] = -1;
visit[i][j] = -1;
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
scanf("%c", &maze[i][j]);
//개행 문자 인식하는 거 주의
if (maze[i][j] == '\n')scanf("%c", &maze[i][j]);
//물이 시작하는 곳을 queue에 넣는다.
if (maze[i][j] == '*') {
q.push(make_pair(i, j));
dist[i][j] = 0;
}
//시작점은 다른 queue에 넣어준다.
if (maze[i][j] == 'S') {
s_r = i;
s_c = j;
qq.push(make_pair(i, j));
visit[i][j] = 0;
}
if (maze[i][j] == 'D') {
d_r = i;
d_c = j;
}
}
}
//먼저 물이 차는 시간을 dist 배열에 저장한다.
while (!q.empty()) {
int row = q.front().first;
int col = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int nr = row + dr[i];
int nc = col + dc[i];
if (nr >= 0 && nr < r && nc >= 0 && nc < c) {
if (maze[nr][nc] != 'D' && maze[nr][nc] != 'X' && dist[nr][nc] == -1) {
dist[nr][nc] = dist[row][col] + 1;
q.push(make_pair(nr, nc));
}
}
}
/*
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
printf("%2d ", dist[i][j]);
}
printf("\n");
}
printf("\n");
*/
}
//고슴도치를 이동시킨다.
while (!qq.empty()) {
int row = qq.front().first;
int col = qq.front().second;
qq.pop();
for (int i = 0; i < 4; i++) {
int nr = row + dr[i];
int nc = col + dc[i];
if (nr >= 0 && nr < r && nc >= 0 && nc < c) {
if (maze[nr][nc] == 'X') continue;
if (visit[nr][nc] != -1) continue;
if (dist[nr][nc] != -1 && visit[row][col] + 1 >= dist[nr][nc]) continue;
qq.push(make_pair(nr, nc));
visit[nr][nc] = visit[row][col] + 1;
}
}
}
if (visit[d_r][d_c] == -1)printf("KAKTUS\n");
else printf("%d\n", visit[d_r][d_c]);
return 0;
}
|
cs |
'알고리즘' 카테고리의 다른 글
백준 9019 DSLR (0) | 2019.04.08 |
---|---|
백준 13913 숨바꼭질 4 (0) | 2019.04.08 |
백준 2206 벽 부수고 이동하기 (0) | 2019.04.08 |
백준 1261 알고스팟 (0) | 2019.04.08 |
백준 13549 숨바꼭질 3 (0) | 2019.04.08 |
Comments