문제
풀이
맨 처음 익어있는 토마토를 전부 큐에 넣은 후 BFS를 돌리면 됩니다. 숨바꼭질과 비슷하게 방문 처리를 시간으로 하면 됩니다.
코드
Python
import sys
from collections import deque
input = lambda: sys.stdin.readline().rstrip()
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
m, n = map(int, input().split())
time = [[-1] * m for _ in range(n)]
queue = deque()
for i in range(n):
for j, state in enumerate(map(int, input().split())):
if state == 1:
time[i][j] = 0
queue.append((i, j))
elif state == -1:
time[i][j] = 0
while queue:
x, y = queue.popleft()
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
if time[nx][ny] == -1:
time[nx][ny] = time[x][y] + 1
queue.append((nx, ny))
answer = 0
for i in range(n):
for j in range(m):
if time[i][j] == -1:
print(-1)
sys.exit(0)
answer = max(answer, time[i][j])
print(answer)C++
#include <bits/stdc++.h>
using namespace std;
array<int, 4> dx = {1, -1, 0, 0};
array<int, 4> dy = {0, 0, 1, -1};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int m, n;
cin >> m >> n;
vector<vector<int>> time(n, vector<int>(m, -1));
queue<pair<int, int>> q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
int state;
cin >> state;
if (state == 1) {
time[i][j] = 0;
q.push(pair(i, j));
} else if (state == -1)
time[i][j] = 0;
}
}
while (not q.empty()) {
auto [x, y] = q.front();
q.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dx[k], ny = y + dy[k];
if (nx < 0 or nx >= n or ny < 0 or ny >= m)
continue;
if (time[nx][ny] == -1) {
time[nx][ny] = time[x][y] + 1;
q.push(pair(nx, ny));
}
}
}
int answer = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (time[i][j] == -1) {
cout << -1;
return 0;
}
answer = max(answer, time[i][j]);
}
}
cout << answer;
return 0;
}Java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int dx[] = { 1, -1, 0, 0 }, dy[] = { 0, 0, 1, -1 };
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer tk = new StringTokenizer(br.readLine());
int m = Integer.parseInt(tk.nextToken()), n = Integer.parseInt(tk.nextToken());
int time[][] = new int[n][m];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
time[i][j] = -1;
Queue<Pair> queue = new LinkedList<>();
for (int i = 0; i < n; i++) {
tk = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
int state = Integer.parseInt(tk.nextToken());
if (state == 1) {
time[i][j] = 0;
queue.add(new Pair(i, j));
} else if (state == -1)
time[i][j] = 0;
}
}
while (!queue.isEmpty()) {
Pair p = queue.poll();
int x = p.first, y = p.second;
for (int k = 0; k < 4; k++) {
int nx = x + dx[k], ny = y + dy[k];
if (nx < 0 || nx >= n || ny < 0 || ny >= m)
continue;
if (time[nx][ny] == -1) {
time[nx][ny] = time[x][y] + 1;
queue.add(new Pair(nx, ny));
}
}
}
int answer = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (time[i][j] == -1) {
bw.write("-1");
bw.close();
return;
}
answer = Math.max(answer, time[i][j]);
}
}
bw.write(answer + "");
bw.close();
}
}
class Pair {
int first, second;
Pair(int first, int second) {
this.first = first;
this.second = second;
}
}