https://www.acmicpc.net/problem/2573
๋ฌธ์
์ง๊ตฌ ์จ๋ํ๋ก ์ธํ์ฌ ๋ถ๊ทน์ ๋น์ฐ์ด ๋ น๊ณ ์๋ค. ๋น์ฐ์ ๊ทธ๋ฆผ 1๊ณผ ๊ฐ์ด 2์ฐจ์ ๋ฐฐ์ด์ ํ์ํ๋ค๊ณ ํ์. ๋น์ฐ์ ๊ฐ ๋ถ๋ถ๋ณ ๋์ด ์ ๋ณด๋ ๋ฐฐ์ด์ ๊ฐ ์นธ์ ์์ ์ ์๋ก ์ ์ฅ๋๋ค. ๋น์ฐ ์ด์ธ์ ๋ฐ๋ค์ ํด๋น๋๋ ์นธ์๋ 0์ด ์ ์ฅ๋๋ค. ๊ทธ๋ฆผ 1์์ ๋น์นธ์ ๋ชจ๋ 0์ผ๋ก ์ฑ์์ ธ ์๋ค๊ณ ์๊ฐํ๋ค.
2 | 4 | 5 | 3 | |||
3 | 2 | 5 | 2 | |||
7 | 6 | 2 | 4 | |||
๊ทธ๋ฆผ 1. ํ์ ๊ฐ์๊ฐ 5์ด๊ณ ์ด์ ๊ฐ์๊ฐ 7์ธ 2์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅ๋ ๋น์ฐ์ ๋์ด ์ ๋ณด
๋น์ฐ์ ๋์ด๋ ๋ฐ๋ท๋ฌผ์ ๋ง์ด ์ ํด์๋ ๋ถ๋ถ์์ ๋ ๋นจ๋ฆฌ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์, ๋ฐฐ์ด์์ ๋น์ฐ์ ๊ฐ ๋ถ๋ถ์ ํด๋น๋๋ ์นธ์ ์๋ ๋์ด๋ ์ผ๋ ๋ง๋ค ๊ทธ ์นธ์ ๋์๋จ๋ถ ๋ค ๋ฐฉํฅ์ผ๋ก ๋ถ์ด์๋ 0์ด ์ ์ฅ๋ ์นธ์ ๊ฐ์๋งํผ ์ค์ด๋ ๋ค. ๋จ, ๊ฐ ์นธ์ ์ ์ฅ๋ ๋์ด๋ 0๋ณด๋ค ๋ ์ค์ด๋ค์ง ์๋๋ค. ๋ฐ๋ท๋ฌผ์ ํธ์์ฒ๋ผ ๋น์ฐ์ ๋๋ฌ์ธ์ฌ ์์ ์๋ ์๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฆผ 1์ ๋น์ฐ์ ์ผ๋ ํ์ ๊ทธ๋ฆผ 2์ ๊ฐ์ด ๋ณํ๋๋ค.
๊ทธ๋ฆผ 3์ ๊ทธ๋ฆผ 1์ ๋น์ฐ์ด 2๋ ํ์ ๋ณํ ๋ชจ์ต์ ๋ณด์ฌ์ค๋ค. 2์ฐจ์ ๋ฐฐ์ด์์ ๋์๋จ๋ถ ๋ฐฉํฅ์ผ๋ก ๋ถ์ด์๋ ์นธ๋ค์ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ๋งํ๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฆผ 2์ ๋น์ฐ์ ํ ๋ฉ์ด๋ฆฌ์ด์ง๋ง, ๊ทธ๋ฆผ 3์ ๋น์ฐ์ ์ธ ๋ฉ์ด๋ฆฌ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค.
2 | 4 | 1 | ||||
1 | 1 | 5 | ||||
5 | 4 | 1 | 2 | |||
๊ทธ๋ฆผ 2
3 | ||||||
4 | ||||||
3 | 2 | |||||
๊ทธ๋ฆผ 3
ํ ๋ฉ์ด๋ฆฌ์ ๋น์ฐ์ด ์ฃผ์ด์ง ๋, ์ด ๋น์ฐ์ด ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋ )์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๊ทธ๋ฆผ 1์ ๋น์ฐ์ ๋ํด์๋ 2๊ฐ ๋ต์ด๋ค. ๋ง์ผ ์ ๋ถ ๋ค ๋ น์ ๋๊น์ง ๋ ๋ฉ์ด๋ฆฌ ์ด์์ผ๋ก ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ 0์ ์ถ๋ ฅํ๋ค.
์ ๋ ฅ
์ฒซ ์ค์๋ ์ด์ฐจ์ ๋ฐฐ์ด์ ํ์ ๊ฐ์์ ์ด์ ๊ฐ์๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ N๊ณผ M์ด ํ ๊ฐ์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. N๊ณผ M์ 3 ์ด์ 300 ์ดํ์ด๋ค. ๊ทธ ๋ค์ N๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ๋ฐฐ์ด์ ๊ฐ ํ์ ๋ํ๋ด๋ M๊ฐ์ ์ ์๊ฐ ํ ๊ฐ์ ๋น ์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๊ฐ ์นธ์ ๋ค์ด๊ฐ๋ ๊ฐ์ 0 ์ด์ 10 ์ดํ์ด๋ค. ๋ฐฐ์ด์์ ๋น์ฐ์ด ์ฐจ์งํ๋ ์นธ์ ๊ฐ์, ์ฆ, 1 ์ด์์ ์ ์๊ฐ ๋ค์ด๊ฐ๋ ์นธ์ ๊ฐ์๋ 10,000 ๊ฐ ์ดํ์ด๋ค. ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ํ๊ณผ ์ด, ๋ง์ง๋ง ํ๊ณผ ์ด์๋ ํญ์ 0์ผ๋ก ์ฑ์์ง๋ค.
์ถ๋ ฅ
์ฒซ ์ค์ ๋น์ฐ์ด ๋ถ๋ฆฌ๋๋ ์ต์ด์ ์๊ฐ(๋ )์ ์ถ๋ ฅํ๋ค. ๋ง์ผ ๋น์ฐ์ด ๋ค ๋ น์ ๋๊น์ง ๋ถ๋ฆฌ๋์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋ค.
ํ์ด
๋ณธ ๋ฌธ์ ๋ ์ฝ๊ฐ ์น์ฆ(https://www.acmicpc.net/problem/2638) ๋ฌธ์ ์ ์์ฉ๋ฒ์ ์ด๋ผ๋ ๋๋์ด ๋ค์๋ค.
๊ทผ๋ฐ ์น์ฆ๋ฌธ์ ํ์ด๋ฅผ ์์ ์๋ค.. ์ํด..
์ฐ์ ํฐ ํ์ด๋
1. bfs ๋ฅผ ๋๋ฆฌ๋ฉฐ ๋นํ ๋ น์ด๊ธฐ
2. bfs ๋ฅผ ๋๋ฆฌ๋ฉฐ ๋นํ๊ฐ ๋๋ฉ์ด๋ก ๋๋์๋์ง ์ฒดํฌ
์ด๋ ๊ฒ ๋๊ฐ์ง๋ก ์งํ๋๋๋ฐ,
// (1)
1๋ฒ์์ ๋นํ๋ฅผ ๋ น์ผ๋
1-1. ์ด์ค๋ฐฐ์ด์ ๋๋ฉฐ ๋ น์ ๋์์ธ ์ผ์๋ค์ ์ฐพ๊ณ
1-2. ์ด ์ผ์์ ์ํ์ข์ฐ๋ฅผ ๋ณด๋ฉด์ ์ผ๋ง๋ ๋ น์ผ์ง (๋ฐ๋ค์ ์ผ๋ง๋ ์ ํด์๋์ง)๋ฅผ ์นด์ดํธ
1-3. ๋ฒกํฐ์ ํด๋น ์ผ์์ x์ขํ, y์ขํ, ๋ น์ผ ์์ push ํด๋
1-4. ์ถํ ํด๋น ๋ฒกํฐ๋ฅผ ๋๋ฉฐ ํ๋ฒ์ ๋ น์ด๊ธฐ
// (2)
์ฌ๊ธฐ์ ํ๋ฒ์ ๋ น์ฌ์ผํ๋ค๋๊ฒ ํฌ์ธํธ๋ค
์์ฐจ์ ์ผ๋ก ๋ น์ฌ๋ฒ๋ฆฌ๋ฉด ๊ฐ์ํด์ ์๊ธด ๋ณํ์ ์ํฅ์ ๋ฐ์ ์ด์ํ๊ฒ ๋ น์๋ฒ๋ฆด ์ ์๊ธฐ ๋๋ฌธ.
// (3)
๊ทธ๋ฆฌ๊ณ ๋ ๋นํ๊ฐ ์ ๋ถ ๋ น์๋ฒ๋ ธ๋ค๋ฉด,
์ฆ ๋ชจ๋ ๋นํ์ ๋์ด๊ฐ 0์ด ๋์๋ค๋ฉด
0์ ์ถ๋ ฅํ๊ณ ํด๋น ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํด์ผํ๋ค.
// Authored by : seondal
// ํ์ด : https://whkakrkr.tistory.com/
// Co-authored by : -
//#include <bits/stdc++.h>
#include <iostream>
#include <queue>
using namespace std;
int dx[4] = {0,0,-1,1};
int dy[4] = {1,-1,0,0};
int n,m, year=0;
int board[302][302];
bool isDivided() {
int cnt = 0;
bool vis[302][302];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
vis[i][j] = false;
queue<pair<int,int>> q;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(vis[i][j] || board[i][j]==0) continue;
cnt++;
vis[i][j] = true;
q.push({i,j});
while(!q.empty()){
auto cur = q.front();
q.pop();
for(int dir=0; dir<4; dir++) {
int x = cur.first + dx[dir];
int y = cur.second + dy[dir];
if(x<0 || x>=n || y<0 || y>=m) continue;
if(vis[x][y] || board[x][y]==0) continue;
q.push({x,y});
vis[x][y] = true;
}
}
}
}
if(cnt>=2) return true;
else return false;
}
bool meltAll() {
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(board[i][j] != 0) return false;
return true;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin >> board[i][j];
while(true){
// ๋ถ๋ฆฌ๊ฐ ๋์๋ค๋ฉด..
if(isDivided()) {
cout << year;
break;
}
// (3) ๋ค ๋
น์๋ค๋ฉด..
if(meltAll()) {
cout << 0;
break;
}
// (1) ๋ฒกํฐ์ ๋
น์ ์ผ์๋ค์ ์ขํ์ ์ ๊ธฐ๋กํ๊ธฐ
vector<tuple<int,int,int>> v;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(board[i][j] == 0) continue;
int sea=0;
for(int dir=0; dir<4; dir++){
int x = i + dx[dir];
int y = j + dy[dir];
if(board[x][y] == 0) sea++;
}
v.push_back({i,j,sea});
}
}
// (2) ๋
น์ด๊ธฐ..
for(int i=0; i<v.size(); i++){
int x,y,melt;
tie(x,y,melt) = v[i];
board[x][y] -= melt;
if(board[x][y] < 0 ) board[x][y] = 0; // ์ผ์ ๋์ด๊ฐ ์์๊ฐ ๋์ง ์๋๋ก ์ฒ๋ฆฌํ๋ค.
}
year++;
}
return 0;
}
/*
*/