#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <deque>
#include <numeric>
#include <map>
#define ll long long
using namespace std;
int N,M,ans;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int board[55][55];
int t_board[55][55];
bool end_board[55][55];
bool vis[55][55];
int water = 9;
bool check4DIR(int y, int x)
{
for(int dir=0;dir<4;dir++)
{
int ny = y + dy[dir];
int nx = x + dx[dir];
if(nx<0 or ny<0 or nx>=M or ny>=N) return false;
}
return true;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> M;
for(int i=0;i<N;i++)
{
string s;
cin >> s;
int j=0;
for(auto a : s) board[i][j++] = a-'0';
}
while(water >= 1)
{
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
t_board[i][j] = board[i][j];
for(int i=0;i<N;i++)
fill(vis[i], vis[i]+M, false);
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
if(t_board[i][j] < water) t_board[i][j] = water;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
if(vis[i][j] or t_board[i][j] > water or end_board[i][j]) continue;
queue<pair<int,int>> q;
vector<pair<int,int>> v;
int tot_water = t_board[i][j] - board[i][j];
bool flag = true;
vis[i][j] = true;
int cnt=1;
q.push({i,j});
v.push_back({i,j});
while(!q.empty())
{
auto cur = q.front(); q.pop();
for(int dir=0;dir<4;dir++)
{
int ny = cur.first + dy[dir];
int nx = cur.second + dx[dir];
if(nx<0 or ny<0 or ny>=N or nx>=M){
flag = false;
continue;
}
if(vis[ny][nx] or t_board[ny][nx] > water) continue;
if(!check4DIR(ny, nx)) flag = false;
q.push({ny, nx});
v.push_back({ny,nx});
vis[ny][nx] = true;
tot_water += t_board[ny][nx] - board[ny][nx];
cnt++;
}
}
if(flag == true){
for(int a=0;a<v.size();a++)
end_board[v[a].first][v[a].second] = true;
ans += tot_water;
ans += cnt;
}
}
}
water--;
}
cout << ans;
return 0;
}
- 로직
물의 양
을 9 --> 1
로 줄여가며 각 영역마다 담을 수 있는 최대 물
을 저장
- 문제와 다르게
물과 땅의 높이차가 있어야 흐르지 않는 것
으로 이해
하고 문제를 풀었다
(영역의 개수
를 cnt
로 구한 뒤 마지막에 더해
주면 동일한 높이에서 흐르지 않는것과 같은 계산
이 가능
!)
해당 영역
이 수영장이 될 수 있는 조건
인 둘러쌓인 상태를 검사
하기 위해서 범위 검사
를 사용
--> 연결된 영역
중 하나의 좌표
라도 4방향이 board[][]
를 넘어가면 둘러쌓이지 않은 것
임
수영장의 조건
을 만족하는 영역
은 tot_water
과 cnt
를 더해서 물의 양
을 구한다
(vector를 이용
해서 해당 영역에 대한 end처리
를 해서 더 낮은 물에서 수영장이 구성되어도 답으로 처리되지 않게 함
)
- 느낀 점
- 처음에
땅과 물의 높이차가 있어야 흐르지 않는것으로 이해
하고 문제를 풀었으나,
다행히 영역의 개수
를 이용해서 문제의 의도와 같은 계산
을 할 수 있었다
어렵다