https://www.acmicpc.net/problem/21610
๋ฌธ์
๋ง๋ฒ์ฌ ์์ด๋ ํ์ด์ด๋ณผ, ํ ๋ค์ด๋, ํ์ด์ด์คํฐ, ๋ฌผ๋ณต์ฌ๋ฒ๊ทธ ๋ง๋ฒ์ ํ ์ ์๋ค. ์ค๋ ์๋ก ๋ฐฐ์ด ๋ง๋ฒ์ ๋น๋ฐ๋ผ๊ธฐ์ด๋ค. ๋น๋ฐ๋ผ๊ธฐ๋ฅผ ์์ ํ๋ฉด ํ๋์ ๋น๊ตฌ๋ฆ์ ๋ง๋ค ์ ์๋ค. ์ค๋์ ๋น๋ฐ๋ผ๊ธฐ๋ฅผ ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์์์ ์ฐ์ตํ๋ ค๊ณ ํ๋ค. ๊ฒฉ์์ ๊ฐ ์นธ์๋ ๋ฐ๊ตฌ๋๊ฐ ํ๋ ์๊ณ , ๋ฐ๊ตฌ๋๋ ์นธ ์ ์ฒด๋ฅผ ์ฐจ์งํ๋ค. ๋ฐ๊ตฌ๋์ ์ ์ฅํ ์ ์๋ ๋ฌผ์ ์์๋ ์ ํ์ด ์๋ค. (r, c)๋ ๊ฒฉ์์ rํ c์ด์ ์๋ ๋ฐ๊ตฌ๋๋ฅผ ์๋ฏธํ๊ณ , A[r][c]๋ (r, c)์ ์๋ ๋ฐ๊ตฌ๋์ ์ ์ฅ๋์ด ์๋ ๋ฌผ์ ์์ ์๋ฏธํ๋ค.
๊ฒฉ์์ ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์ (1, 1)์ด๊ณ , ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ ์นธ์ (N, N)์ด๋ค. ๋ง๋ฒ์ฌ ์์ด๋ ์ฐ์ต์ ์ํด 1๋ฒ ํ๊ณผ N๋ฒ ํ์ ์ฐ๊ฒฐํ๊ณ , 1๋ฒ ์ด๊ณผ N๋ฒ ์ด๋ ์ฐ๊ฒฐํ๋ค. ์ฆ, N๋ฒ ํ์ ์๋์๋ 1๋ฒ ํ์ด, 1๋ฒ ํ์ ์์๋ N๋ฒ ํ์ด ์๊ณ , 1๋ฒ ์ด์ ์ผ์ชฝ์๋ N๋ฒ ์ด์ด, N๋ฒ ์ด์ ์ค๋ฅธ์ชฝ์๋ 1๋ฒ ์ด์ด ์๋ค.
๋น๋ฐ๋ผ๊ธฐ๋ฅผ ์์ ํ๋ฉด (N, 1), (N, 2), (N-1, 1), (N-1, 2)์ ๋น๊ตฌ๋ฆ์ด ์๊ธด๋ค. ๊ตฌ๋ฆ์ ์นธ ์ ์ฒด๋ฅผ ์ฐจ์งํ๋ค. ์ด์ ๊ตฌ๋ฆ์ ์ด๋์ M๋ฒ ๋ช ๋ นํ๋ ค๊ณ ํ๋ค. i๋ฒ์งธ ์ด๋ ๋ช ๋ น์ ๋ฐฉํฅ di๊ณผ ๊ฑฐ๋ฆฌ si๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๋ฐฉํฅ์ ์ด 8๊ฐ์ ๋ฐฉํฅ์ด ์์ผ๋ฉฐ, 8๊ฐ์ ์ ์๋ก ํํํ๋ค. 1๋ถํฐ ์์๋๋ก ←, โ, ↑, โ, →, โ, ↓, โ ์ด๋ค. ์ด๋์ ๋ช ๋ นํ๋ฉด ๋ค์์ด ์์๋๋ก ์งํ๋๋ค.
- ๋ชจ๋ ๊ตฌ๋ฆ์ด di ๋ฐฉํฅ์ผ๋ก si์นธ ์ด๋ํ๋ค.
- ๊ฐ ๊ตฌ๋ฆ์์ ๋น๊ฐ ๋ด๋ ค ๊ตฌ๋ฆ์ด ์๋ ์นธ์ ๋ฐ๊ตฌ๋์ ์ ์ฅ๋ ๋ฌผ์ ์์ด 1 ์ฆ๊ฐํ๋ค.
- ๊ตฌ๋ฆ์ด ๋ชจ๋ ์ฌ๋ผ์ง๋ค.
- 2์์ ๋ฌผ์ด ์ฆ๊ฐํ ์นธ (r, c)์ ๋ฌผ๋ณต์ฌ๋ฒ๊ทธ ๋ง๋ฒ์ ์์ ํ๋ค. ๋ฌผ๋ณต์ฌ๋ฒ๊ทธ ๋ง๋ฒ์ ์ฌ์ฉํ๋ฉด, ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ์นธ์ ๋ฌผ์ด ์๋ ๋ฐ๊ตฌ๋์ ์๋งํผ (r, c)์ ์๋ ๋ฐ๊ตฌ๋์ ๋ฌผ์ด ์์ด ์ฆ๊ฐํ๋ค.
- ์ด๋๋ ์ด๋๊ณผ ๋ค๋ฅด๊ฒ ๊ฒฝ๊ณ๋ฅผ ๋์ด๊ฐ๋ ์นธ์ ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ์นธ์ด ์๋๋ค.
- ์๋ฅผ ๋ค์ด, (N, 2)์์ ์ธ์ ํ ๋๊ฐ์ ์นธ์ (N-1, 1), (N-1, 3)์ด๊ณ , (N, N)์์ ์ธ์ ํ ๋๊ฐ์ ์นธ์ (N-1, N-1)๋ฟ์ด๋ค.
- ๋ฐ๊ตฌ๋์ ์ ์ฅ๋ ๋ฌผ์ ์์ด 2 ์ด์์ธ ๋ชจ๋ ์นธ์ ๊ตฌ๋ฆ์ด ์๊ธฐ๊ณ , ๋ฌผ์ ์์ด 2 ์ค์ด๋ ๋ค. ์ด๋ ๊ตฌ๋ฆ์ด ์๊ธฐ๋ ์นธ์ 3์์ ๊ตฌ๋ฆ์ด ์ฌ๋ผ์ง ์นธ์ด ์๋์ด์ผ ํ๋ค.
M๋ฒ์ ์ด๋์ด ๋ชจ๋ ๋๋ ํ ๋ฐ๊ตฌ๋์ ๋ค์ด์๋ ๋ฌผ์ ์์ ํฉ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N, M์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ N๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋ค. r๋ฒ์งธ ํ์ c๋ฒ์งธ ์ ์๋ A[r][c]๋ฅผ ์๋ฏธํ๋ค.
๋ค์ M๊ฐ์ ์ค์๋ ์ด๋์ ์ ๋ณด di, si๊ฐ ์์๋๋ก ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ M๋ฒ์ ์ด๋์ด ๋ชจ๋ ๋๋ ํ ๋ฐ๊ตฌ๋์ ๋ค์ด์๋ ๋ฌผ์ ์์ ํฉ์ ์ถ๋ ฅํ๋ค.
๊ณจ๋ 5.
์ด๊ฒ๋ ์ผ์ฑ sw ๊ธฐ์ถ๋ฌธ์ ์ด๋ค~~ ์๋ฎฌ๋ ์ด์ ~~ ๋นก๊ตฌํ~~~
์ผ๋จ ์ฒซ ์ด๋์ด ์๋ง๊ฒ ๋์ค๊ธฐ๊น์ง ๋ฑ 1์๊ฐ์ด ๊ฑธ๋ ธ๋ค!
๋๋จธ์ง ํ๋ฆผใ ใ
์ฒซ๋ฒ์งธ ๊ณผ์ ์ด ๋ง๋๊ฑธ ๋ณด๋, ๋ญ๊ฐ ์ด๊ธฐํ๋ฅผ ์ํด์ค ๊ฒ ๊ฐ๋ค๋ ์์ด ๊ฐํ๊ฒ ์๋ค.
๊ทธ๋์ ์ฐพ์๋ณด๋ cloud ๋ฒกํฐ ์ด๊ธฐํ๋ฅผ ์ํ์์.
cloud.clear()ํ๊ณ ์ฌ๋์ !
๋ต๊ณผ ์กฐ๊ธ ๋ ๋น์ทํด์ง๊ธด ํ๋๋ฐ ๊ทธ๋๋ ํ๋ฆฌ๋ค. ์ด๋๊ฐ ๋ฌธ์ ์ผ๊น
์ฒซ๋ฒ์งธ ์ค์ : ์ขํ ์ค์..! dy ๋ถํธ๋ฅผ ๋ฐ๋๋ก ํ์์ ใ ใ
int dx[8] = {-1,-1,0,1,1,1,0,-1};
int dy[8] = {0,-1,-1,-1,0,1,1,1};
๋๋ฒ์งธ ์ค์ : moveCloud ํจ์์์ ์ขํ์ ๋ณด๋ง ๊ธฐ์ตํด๋จ๋๋ฐ
ํจ์ ๋ง์ง๋ง์,,, ๊ทธ ์ขํ์ ๊ตฌ๋ฆ์ด ์์ผ๋ฉด ์์ ๋ฒ๋ฆฌ๋ ๋ฐ๋์ ๋ต์ด ์ด์ํ๊ฒ ๋์๋ค.
์ด์จ๋ ์ด๊ฑด ๋ ์ค์ค๋ก์ ํ์ผ๋ก 2์๊ฐ๋ง์ ํ์ด๋๋ค!!! ์๋ฟ๋ฏ
๋์ ํ์ด
// ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int n;
int m;
int map[51][51][2]; // 0: ๋น๊ตฌ๋ฆ ์ฌ๋ถ, 1: ๋ฌผ์ ์
int ds[101][2];
int dx[8] = {-1,-1,0,1,1,1,0,-1};
int dy[8] = {0,-1,-1,-1,0,1,1,1};
queue<pair<int, int>> q;
vector<pair<int, int>> cloud;
int gx[4] = {1, -1, 1, -1};
int gy[4] = {-1, -1, 1, 1};
void moveCloud(int idx, int j, int k, int moveY, int moveX){
// ๊ตฌ๋ฆ์ด s๋งํผ ์ด๋
for (int i = 0; i < ds[idx][1]; ++i){
if(j+moveY < 1){
j = n;
} else if(j+moveY > n){
j = 1;
} else {
j = j + moveY;
}
if(k+moveX < 1){
k = n;
} else if(k+moveX > n){
k = 1;
} else {
k = k + moveX;
}
}
// ๋น๊ฐ ๋ด๋ฆผ
map[j][k][1] += 1;
q.push({j, k});
// ๊ตฌ๋ฆ ์ฌ๋ผ์ง
// map[j][k][0] = 0; // ์ด๊ฑฐ๋๋ฌธ์ ์ ๋จน์
cloud.push_back({j, k});
}
void copyWater(){
while (!q.empty()){
int cnt = 0;
pair<int, int> a = q.front();
q.pop();
for (int d = 0; d < 4; ++d){
int ny = a.first + gy[d];
int nx = a.second + gx[d];
if(nx<1 || ny<1 || nx>n || ny>n) continue;
if(map[ny][nx][1]) cnt++;
}
map[a.first][a.second][1] += cnt;
}
}
void makeCloud(){
for (int i = 1; i <= n; ++i){
for (int j = 1; j <= n; ++j){
bool had = false;
for (int k = 0; k < cloud.size(); ++k){
if(cloud[k] == make_pair(i,j)) {
had = true;
break;
}
}
if (!had && map[i][j][1] > 1){
map[i][j][0] = 1;
map[i][j][1] -= 2;
}
}
}
cloud.clear();
}
int main(){
cin >> n >> m;
for (int i = 1; i <= n;++i){
for (int j = 1; j <= n; ++j){
cin >> map[i][j][1];
}
}
for (int i = 0; i < m;++i){
cin >> ds[i][0] >> ds[i][1];
}
map[n][1][0] = 1;
map[n][2][0] = 1;
map[n-1][1][0] = 1;
map[n-1][2][0] = 1;
for (int i = 0; i < m; ++i){
int moveX = dx[ds[i][0] - 1];
int moveY = dy[ds[i][0] - 1];
for (int j = 1; j <= n; ++j){ // ๊ตฌ๋ฆ ์ด๋
for (int k = 1; k <= n; ++k){
if(map[j][k][0] == 1){
map[j][k][0] = 0;
moveCloud(i, j, k, moveY, moveX);
}
}
}
copyWater();
makeCloud();
}
int sum = 0;
for (int i = 1; i <= n;++i){
for (int j = 1; j <= n;++j){
sum += map[i][j][1];
}
}
cout << sum;
}
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++/BOJ] 16236 : ์๊ธฐ ์์ด (bfs/dfs) (0) | 2023.04.13 |
---|---|
[C++/BOJ] 2468 : ์์ ์์ญ (bfs/dfs) (0) | 2023.04.13 |
[C++/BOJ] 21608 : ์์ด ์ด๋ฑํ๊ต (์๋ฎฌ๋ ์ด์ ) (0) | 2023.04.05 |
[C++/BOJ] 21318 : ํผ์๋ ธ ์ฒด์กฐ (๋์ ํฉ) (0) | 2023.04.02 |
[C++/BOJ] 17179 : ์ผ์ดํฌ ์๋ฅด๊ธฐ (์ด์งํ์) (0) | 2023.03.29 |