tomato (λ°±μ€ 7576) π solution π
μ€λμ λ°±μ€ 7576λ² λ¬Έμ , ν λ§ν λ₯Ό κ°μ Έμμ΅λλ€
λ¬Έμ λ΄μ©μ νμ
νλ€κ³ κ°μ νκ³ μ μ¬κ³ μ νλ¦μ λ°λ‘ μ€λͺ
ν΄λ³Όκ²μ
ν λ§ν κ° 1κ°λΌκ³ κ°μ ν΄λ³ΌκΉμ ?
μ΄ λ¬Έμ λ ν μ μμ νΌμ Έλκ° λͺ¨λ ν λ§ν μ λ°©λ¬Ένκ² νλ λ° βμ΅μβ λͺμΌμ΄ μ§λμΌνλμ§ λ¬»κ³ μμ΅λλ€
βκ·Έλνμ μ΅λ¨κ±°λ¦¬β λ¬Έμ μ μλΉν μ μ¬ν΄λ³΄μ
λλ€
'κ·Έλν μ΅λ¨κ±°λ¦¬'λΌλ μ΄κ΅¬κ° μ
λ ₯ xλ‘ μ£Όμ΄μ§λ©΄ μ λ λ°μ¬μ μΌλ‘ 'BFS'λΌλ μΆλ ₯ yλ₯Ό λ μ¬λ¦¬λλ°μ
ꡬμ’
λ§μ μλμ μ±
μκ³ λ¦¬μ¦ λ¬Έμ ν΄κ²°μ λ΅μμλ DFSμ λ¬λ¦¬ BFSλ κ·Έλν μμμ βμ΅λ¨κ±°λ¦¬βλ₯Ό μ°Ύλ μ©λλ‘ μ νλλ€κ³ νμμ΅λλ€ μ΄μ λ°ν΄μ DFSλ κ·Έλνμ κ³ μ νΉμ§μ μΆμΆνλ λ° μ μ©ν΄ μ¬μ© λ²μκ° λλ€κ³ νμ£
μλ μ½λλ BFS κΈ°λ³Έ 골격μ λλ€ (μμ μμ€μ½λλ c++λ‘ μμ±λμμ΅λλ€)
void bfs(int start, const vector<vector<int>>& graph, vector<bool>& visited) {
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int curr = q.front();
q.pop();
cout << curr << " "; // λ°©λ¬Έν λ
Έλ μΆλ ₯
for (int next : graph[curr]) {
if (!visited[next]) {
q.push(next);
visited[next] = true;
}
}
}
}
μ μ½λλ 2μ°¨μ λ§€νΈλ¦μ€ graphλ‘ μΈμ 리μ€νΈλ₯Ό ꡬννκ³ μμ΅λλ€
bfs ꡬνμ ν΅μ¬μ μλ£κ΅¬μ‘° queueλ‘, νλ₯Ό ν΅ν΄ λ¨Όμ ν¬μ
λ λ
Έλλ₯Ό λ¨Όμ λ°©λ¬Ένκ³ , μ΄λ‘μ¨ κΉμ΄κ° μμ λ
Έλλ€λΆν° λ°©λ¬Έν μ μκ² λ©λλ€
λ λ
Έλ λ°©λ¬Έμ¬λΆλ₯Ό λνλ΄λ λ²‘ν° visitedλ₯Ό ν΅ν΄ λ
Έλλ₯Ό μ€λ³΅ν΄μ λ°©λ¬Ένμ§ μκ² νκ³ , while 무ν루νλ₯Ό λ²μ΄λ μ μκ² ν΄μ€λλ€
λ§€ ν΄λ§λ€ νμμ λ
Έλλ₯Ό κΊΌλ΄ ν΄λΉ λ
Έλμ μΈμ λ
Έλλ₯Ό νμ λͺ¨λ λ£μ λ€μ, μΈμ λ
Έλλ€μ λ°©λ¬Έν μνλ‘ μ²λ¦¬ν΄μ£Όκ³ μμ΅λλ€ λ§€ ν΄λ§λ€ λ°©λ¬Έν λ
Έλλ pop() ν΄μ£Όλ κ±Έ μμ§ λ§μΈμ! (μμΌλ©΄ 무ν루νμ λΉ μ§κ² λ©λλ€β¦)
ν λ§ν λ¬Έμ μ ν° νμ μ°μ μ΄ BFS μμ€μ½λμΈλ°, λ³μκ° μμ΅λλ€
μ΄κΈ° λ¨κ³μ μ΅μ ν λ§ν κ° 2κ°λΌλ©΄ νμ λ ν λ§ν λ‘ μΈν΄ μ΅μ ν λ§ν λ€μ΄ λ€μ΄κ°μΌ ν©λλ€ κ·Έλ°λ° κΈ°μ‘΄ bfsμ λ¬λ¦¬ κ°μ λ μ μ΅μ ν λ§ν (λ
Έλ)λ€μ νλ²μ pop() ν΄μΌν©λλ€ λ¬Έμ μμ μꡬνλ 건 λͺ¨λ ν λ§ν κ° λ€ μ΅λλ° κ±Έλ¦¬λ βμκ°βμ΄κΈ° λλ¬Έμ΄μ£ (λ€λ₯Έ λ§λ‘, μκ°μ νλ¦μ λ°λΌ μ΅μ ν λ§ν λ€μ ꡬλΆν μ μμ΄μΌ ν©λλ€)
μ κ° μκ°ν΄λΈ λ°©λ²μ bfsμ ν° νμ μ μ§νλ 2κ°μ νλ₯Ό μ΄μ©νλ κ²μ΄μμ΅λλ€
λ€μ μ½λλ μμ©λ bfsμ ν° νμ
λλ€
while(!q1.empty()) {
while (!q1.empty()) {
int curr = q1.front();
q1.pop();
for (int next : graph[curr]) {
if (!visited[next]) {
q2.push(next);
visited[next] = true;
}
}
}
while (!q2.empty()) {
int curr = q2.front();
q2.pop();
for (int next : graph[curr]) {
if (!visited[next]) {
q1.push(next);
visited[next] = true;
}
}
}
}
λ κ°μ νλ λ€μκ³Ό κ°μ΄ μ΄μ©λ©λλ€
νμλΌμΈ μ μμμ μμ tμ λν΄ νμ¬ μμ tμ λ°©λ¬Έν λ
Έλλ q1μμ κΊΌλ΄μ§κ³ , λ€μμ λ°©λ¬Έν΄μΌ ν λ
Έλ(μ¦ t+1μ λ°©λ¬Έλ λ
Έλμ΄μ q1μμ κΊΌλ΄μ§ λ
Έλμ μΈμ ν λ
Έλλ€)λ€μ q2μ μΆκ°λ©λλ€
μ΄ λ§€μ»€λμ¦μ νμ μμ μ λ°©λ¬Έν λ
Έλμ μ§μ μμ μ λ°©λ¬Έν λ
Έλλ₯Ό μ νν ꡬλΆν©λλ€
λ νλ₯Ό μννλ λ whileλ¬Έμ ν° whileλ¬Έμ΄ κ°μΈκ³ μμ΅λλ€ μ΄ λ°λ³΅λ¬Έμ λ νκ° λΉ μνμΈμ§ νμΈνλ, μ¦ νμμ΄ λλ¬λμ§ νλ¨νλ κΈ°μ‘΄ bfs μ½λμ whileλ¬Έκ³Ό κ°μ μν μ ν©λλ€
μ΄μ whileλ¬Έ μ¬μ΄μ¬μ΄μ μκ° tλ₯Ό μ
λ°μ΄νΈ ν΄μ£Όκ³ (t++) λ€μκ³Ό κ°μ 쑰건λ€μ μΆκ°ν΄μ£Όλ©΄ λ©λλ€
- (μ΅μ ν λ§ν μ + λΉμ리)μ μκ° μ 체 λ°μ€ μΉΈμμ λμΌνκ°? -> 첫 μνμ μ΄λ λ€λ©΄ μ²μλΆν° μ΅ν ν λ§ν κ° μμΌλ―λ‘ λ°λ³΅λ¬Έ νμΆ ν -1 μΆλ ₯, κ·Έκ² μλλΌλ©΄ νμμ μλ£ν κ²μ΄λ λ°λ³΅λ¬Έ νμΆ
- q1 μν μ΄νμλ μ¬μ ν q2κ° λΉμ΄μλκ°? νΉμ κ·Έ λ°λμΈκ°? -> λ μ΄μ μνν μΉΈμ΄ μμΌλ―λ‘ λ°λ³΅λ¬Έ νμΆ
λ§μ§λ§μΌλ‘ 체μ€νκ³Ό κ°μ΄ νΉμν ννλ‘ κ·Έλνλ₯Ό νννλ μ½λμ
λλ€
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
// κ°λ‘ M, μΈλ‘ N ν¬κΈ°μ λ§€νΈλ¦μ€λ₯Ό νμ
int nextn, nextm;
for(int i=0;i<4;++i) {
nextn=nindex+dx[i];
nextm=mindex+dy[i];
if(nextn<0 || nextm<0 || nextn>=N || nextm>=M || box[nextn][nextm]==1) continue;
if(box[nextn][nextm]==0) { q2.push({nextn, nextm}); }
}
체μ€ν, λ°λνμ νν 2μ°¨μ μ’νλ‘ λνλΌ μ μλλ°μ λ§μ μ΄λμ μ μ½μ΄ μλ€λ©΄ (μ. μνμ’μ°λ‘λ§ μ΄λκ°λ₯, λκ°μ μ΄λλΆκ°) μ’ν μμμ μ¦λΆμ λ»νλ dx,dy λ³μλ₯Ό μ΄μ©ν΄ λ³΄λ€ μ½κ² νμμ ꡬνν μ μμ΅λλ€
μ΄λ μ·¨ν μ μλ μ νμ§λ 4κ°μ§μ΄λ―λ‘ dx, dy μμ ν¬κΈ° 4μ λ°°μ΄λ‘ ννν μ μμ΅λλ€
2μ°¨μ 벑ν°λ‘ κ·Έλνλ₯Ό νννλ©΄ μΈμ 리μ€νΈ λλ μΈμ νλ ¬μ΄ λΆνμνλ€λ μ₯μ μ΄ μμ΅λλ€
μ 체 μμ€μ½λ
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
using namespace std;
#define fastio ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
int main() {
fastio;
queue<pair<int,int>> q1,q2;
int days=0;
int rotton=0, non=0;
int N,M;
cin >> M >> N;
int numBox=M*N;
vector<vector<int>> box(N,vector<int>(M,-1));
for(int n=0;n<N;++n) {
for(int m=0;m<M;++m) {
cin >> box[n][m];
if(box[n][m]==1) { rotton++; q1.push({n,m}); }
if(box[n][m]==-1) non++;
}
}
if(rotton+non==numBox) { cout << 0 << '\n'; return 0; }
while(!q1.empty()) {
while(!q1.empty()) {
int nindex=q1.front().first; int mindex=q1.front().second; q1.pop();
int nextn, nextm;
for(int i=0;i<4;++i) {
nextn=nindex+dx[i];
nextm=mindex+dy[i];
if(nextn<0 || nextm<0 || nextn>=N || nextm>=M || box[nextn][nextm]==1) continue;
if(box[nextn][nextm]==0) { box[nextn][nextm]=1; q2.push({nextn, nextm}); rotton++; }
}
if(rotton+non==numBox) { cout << days+1 << '\n'; return 0; }
}
days++;
if(q2.empty()) break;
while(!q2.empty()) {
int nindex=q2.front().first; int mindex=q2.front().second; q2.pop();
int nextn, nextm;
for(int i=0;i<4;++i) {
nextn=nindex+dx[i];
nextm=mindex+dy[i];
if(nextn<0 || nextm<0 || nextn>=N || nextm>=M || box[nextn][nextm]==1) continue;
if(box[nextn][nextm]==0) { box[nextn][nextm]=1; q1.push({nextn, nextm}); rotton++; }
}
if(rotton+non==numBox) { cout << days+1 << '\n'; return 0; }
}
days++;
}
if(rotton+non != numBox) { cout << -1 << '\n'; return 0; }
cout << days << '\n';
return 0;
}