문제 분석
BFS 기초 문제를 풀다보면 만나는 문제이다. 문제의 조건에 토마토의 개수가 1개로 고정된다는 말이 없으므로, 토마토의 개수가 여러 개 일 수 있으며, 이말은 즉 BFS를 돌릴 때의 시작점이 여러개라는 뜻이다.
해결 방법
시작점이 여러 개인 BFS의 경우, 모든 시작점을 큐에 넣고 BFS를 돌면 자연스럽게 거리가 구해진다.
코드
#include <iostream>
#include <queue>
#include <utility>
using namespace std;
#define X first
#define Y second
int board[1001][1001];
bool vis[1001][1001];
int dx[4] = {1,0,-1,0};
int dy[4] = {0,-1,0,1};
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
queue<pair<int,int>> q;
int n, m, k;
int max=0;
cin >> m >> n;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
cin >> k;
board[i][j] = k;
if(k == 1) { // 시작위치 전부 큐에 넣기
q.push({i,j});
vis[i][j] = 1;
}
}
}
while(!q.empty()) {
pair<int,int> cur = q.front();
q.pop();
for(int dir=0;dir<4;dir++) {
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if(vis[nx][ny] || board[nx][ny] != 0) continue;
vis[nx][ny] = 1;
q.push({nx,ny});
board[nx][ny] = board[cur.X][cur.Y] + 1;
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(board[i][j] == 0) {
cout << -1;
return 0;
}
max = board[i][j] > max ? board[i][j] : max;
}
}
cout << max - 1;
return 0;
}
'BOJ > BFS' 카테고리의 다른 글
[C++] BOJ 2667 / BFS (문자열 파싱 접근) (0) | 2021.07.21 |
---|---|
[C++] BOJ 2583 / BFS (sort 사용) (0) | 2021.07.20 |
[C++] BOJ 7569 / BFS (3차원 배열, tuple 사용) (0) | 2021.07.20 |
[C++] BOJ 1697 / BFS (fill, range based for 사용) (0) | 2021.07.19 |
BFS 기본 틀 (0) | 2021.07.19 |