728x90
그냥 저냥 무난했던 BFS 문제였습니다.
처음에 BFS 정말 막막했는데 확실히 풀면 풀 수록 뭔가 늘긴 하는거같네요...
익은 토마토가 있는 칸을, 입력받을때마다 큐에 넣어주고 visit 처리 했습니다.
토마토가 없는 칸(-1)도 입력을 받을 때 마다 visit 처리 해줬습니다
왜냐하면 나중에 visit을 전부 뜯어보며 아직 못 간곳이 있으면(visit값이 0인곳이 한 곳이라도 있으면)
토마토를 전부 익히지 못 한 케이스로 보고 -1을 출력할 것입니다.
bfs돌리는건 모든 1을 대상으로 한번에 스윽 돌렸습니다.
큐 사이즈를 미리 저장해서 그 만큼 반복하는게 그 예시입니다.
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
|
#include <iostream>
#include <queue>
using namespace std;
int m, n;
int arr[1001][1001];
bool visit[1001][1001];
queue<pair<int,int>> q;
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
//이동횟수
int cnt = 0;
void bfs() {
while (!q.empty()) {
int qsize = q.size();
bool result = false;
//큐 사이즈를 미리 저장 후 한번에 bfs해준다
for (int i = 0; i < qsize; i++) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int j = 0; j < 4; j++) {
int nx = x + dx[j];
int ny = y + dy[j];
if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
if (visit[nx][ny]) continue;
if (arr[nx][ny] == 0) {
visit[nx][ny] = true;
q.push({ nx,ny });
result = true;
}
}
}
//만약 탐색한 곳이 아무곳도 없던 경우였다면 cnt를 올리지않는다
if (result == true) cnt++;
}
}
int main() {
cin >> m >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
if (arr[i][j] == 1) {
q.push({ i,j });
visit[i][j] = true;
}
else if (arr[i][j] == -1)
visit[i][j] = true;
}
bfs();
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
if (visit[i][j] == 0) {
cout << -1;
return 0;
}
}
cout << cnt;
return 0;
}
|
cs |
728x90
'PS > 백준' 카테고리의 다른 글
[백준 1463번] 1로 만들기 C++ (0) | 2021.04.12 |
---|---|
[백준 1697번] 숨바꼭질 C++ (0) | 2021.03.19 |
[백준 2206번] 벽 부수고 이동하기 C++ (0) | 2021.03.19 |
[백준 3055번] 탈출 C++ (0) | 2021.03.18 |
[백준 5427번] 불 C++ (0) | 2021.03.18 |