728x90
https://www.acmicpc.net/problem/7576
7576번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토
www.acmicpc.net
아래 문제와 거의 동일한 문제인데, 7569번은 3차원이고 이 문제는 2차원이다.
이번에는 box안의 값을 +1씩 올려서 가장 큰 값을 모든 토마토가 익은 날로 했다.
만약 0이 하나라도 있다면 모든 토마토가 익을 수 없다는 것이므로 -1을 출력한다.
https://nyeoungkm.tistory.com/entry/백준c-7569번-토마토
[백준/c++] 7569번: 토마토
https://www.acmicpc.net/problem/7569 7569번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수
nyeoungkm.tistory.com
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int m,n,box[1001][1001];
int dir[4][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}};
queue<pair<int, int>> q;
void BFS(){
while(!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i=0; i<4; i++){
int dx = x + dir[i][0];
int dy = y + dir[i][1];
if(0<=dx&&dx<n&&0<=dy&&dy<m && box[dx][dy] == 0){ //범위내&방문안한&익지않은토마토인경우
q.push({dx, dy});
box[dx][dy] = box[x][y] + 1;
}
}
}
}
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> m >> n;
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++){
cin >> box[i][j];
if(box[i][j] == 1) q.push({i, j});
}
}
BFS();
int ans = 0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(box[i][j] == 0) {
cout << -1 << '\n';
return 0;
}
ans = max(ans, box[i][j]);
}
}
cout << ans - 1 << '\n';
return 0;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 1449번: 수리공 항승 (0) | 2022.07.25 |
---|---|
[백준/c++] 1205번: 등수 구하기 (0) | 2022.07.24 |
[백준/c++] 10026번: 적록색약 (0) | 2022.07.24 |
[백준/c++] 2583번: 영역 구하기 (0) | 2022.07.23 |
[백준/c++] 2816번: 디지털 티비 (0) | 2022.07.23 |