서의 공간
[백준] 7576_토마토 본문
[문제]: 7576번: 토마토 (acmicpc.net)
익은 토마토는 여러 곳에 동시에 있을 수 있다. 기억해야 할 것은 시작점이 여러 개인 BFS는 그냥 모든 시작점을 큐에 넣고 BFS 돌리면 끝이다. 방문 되었는지의 여부를 나타내는 배열이 아닌 거리(몇일 걸렸는지 나타내는 시간)를 의미하는 days배열임을 주의 할 것. 깊이가 1 증가할 때마다 days도 1씩 증가한다.
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int board[1002][1002];
int days[1002][1002];
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, -1, 0, 1 };
int M, N;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
queue<pair<int, int>> q;
cin >> M >> N;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
cin >> board[i][j];
if (board[i][j] == 1)
q.push({ i, j });
if (board[i][j] == 0)// 익지않은 토마토인 경우
days[i][j] = -1;
}
}
while (!q.empty()) {
auto cur = q.front(); q.pop();
for (int dir = 0; dir < 4; ++dir) {
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if (nx < 0 || nx >= N || ny < 0 || ny >= M) continue;
if (days[nx][ny] >= 0 || board[nx][ny] == -1) continue;
days[nx][ny] = days[cur.first][cur.second] + 1;
q.push({ nx, ny });
}
}
int ret = 0;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
if (days[i][j] == -1) {
cout << -1;
return 0;
}
ret = max(ret, days[i][j]);
}
}
cout << ret << '\n';
return 0;
}
'Algorithm > 백준' 카테고리의 다른 글
[백준] 1697_숨바꼭질 (0) | 2020.12.03 |
---|---|
[백준] 4179_불! (0) | 2020.12.03 |
[백준] 1926_그림 (0) | 2020.12.03 |
[백준] 1676_팩토리얼 0의 개수 (0) | 2020.11.30 |
[백준] 10826_피보나치 수 4 (0) | 2020.11.27 |
Comments