반응형
문제 : https://www.acmicpc.net/problem/7576
아이디어
BFS를 풀이하는 일반적인 방식을 이용
1. 토마토 행렬을 배열에 입력하고, 토마토가 1이면 1인 토마토의 좌표를 큐에 푸시
2-0. 큐의 사이즈를 기억하고 큐에서 하나를 빼낸다. 빼낸 좌표가 (y,x)면
2-1. 빼낸 좌표의 (y,x+1) 값이 0이면 토마토를 1로 바꾸고 (y,x+1) 좌표를 큐에 푸시
2-2. 빼낸 좌표의 (y,x-1) 값이 0이면 토마토를 1로 바꾸고 (y,x-1) 좌표를 큐에 푸시
2-3. 빼낸 좌표의 (y+1,x) 값이 0이면 토마토를 1로 바꾸고 (y+1,x) 좌표를 큐에 푸시
2-4. 빼낸 좌표의 (y-1,x) 값이 0이면 토마토를 1로 바꾸고 (y-1,x) 좌표를 큐에 푸시
3. 2-0에서 기억한 큐의 사이즈만큼 2번 전체를 반복(계속 삽입되는 큐에서 이전 날짜에 익은 토마토만 빼내기 위해 큐의 사이즈를 기억시킨것)
4. 날짜+1
5. 큐가 비어있지 않다면 2번으로 이동
6. 토마토를 전수조사해서 0인 토마토가 있으면 -1 출력하고 없으면 날짜를 출력
구현
// c++
#include <iostream>
#include <queue>
using namespace std;
int m, n;
int box[1001][1001];
queue<pair<int, int>>q;
void input() {
cin >> m >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int tmp;
cin >> tmp;
if (tmp == 1) {
q.push(make_pair(i, j));
box[i][j] = tmp;
}
else if (tmp == -1) box[i][j] = tmp;
}
}
}
int bfs() {
int dy[4] = { -1,1,0,0 };
int dx[4] = { 0,0,-1,1 };
int result = -1;
while (!q.empty()) {
result++;
int qSize = q.size();
for (int i = 0; i < qSize; i++) {
int y = q.front().first;
int x = q.front().second;
q.pop();
for (int i = 0; i < 4; i++) {
int yy = y + dy[i];
int xx = x + dx[i];
if (box[yy][xx] == 0 && yy>=0 && xx>=0 && yy<n && xx<m) {
q.push(make_pair(yy, xx));
box[yy][xx] = 1;
}
}
}
}
return result;
}
bool check() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (box[i][j] == 0) return false;
}
}
return true;
}
int main() {
int result = 0;
input();
result = bfs();
if (check() == false) cout << -1;
else cout << result;
}
최근댓글