Code/백준
[삼성 코테 기출] 21610 - 마법사 상어와 비바라기
코-빗
2024. 3. 24. 16:31
728x90
8방향으로 움직이는 map에서의 단순 구현 문제
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;
int map[50][50];
int visit[50][50];
int N, M;
vector< pair<int, int> > clouds;
int dr[8] = { 0,-1,-1,-1,0,1,1,1 };
int dc[8] = { -1,-1, 0, 1, 1, 1, 0 , -1 };
void new_cloud() {
clouds.clear();
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
if (visit[r][c] == 1) continue;
if (map[r][c] >= 2) {
clouds.push_back(make_pair(r, c));
map[r][c] -= 2;
}
}
}
}
void water_bug() {
vector< pair<int, int> > add;
int size = clouds.size();
for(int i = 0; i < size; i++){
int r = clouds[i].first;
int c = clouds[i].second;
for (int dir = 1; dir < 8; dir+=2) {
int nr = r + dr[dir];
int nc = c + dc[dir];
if (nr < 0 || nc < 0 || nr > N - 1 || nc > N - 1) continue;
if (map[nr][nc] == 0) continue;
add.push_back(make_pair(r, c));
}
}
size = add.size();
for (int i = 0; i < size; i++) {
map[add[i].first][add[i].second]++;
}
}
void move_and_rain(int d, int s) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
visit[i][j] = 0;
}
}
int size = clouds.size();
for (int i = 0; i < size; i++) {
int r = clouds[i].first = (clouds[i].first + dr[d] * s + (N * 50)) % N;
int c = clouds[i].second = (clouds[i].second + dc[d] * s + (N * 50)) % N;
visit[r][c] = 1;
map[r][c] += 1;
}
}
int main(void) {
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
clouds.push_back(make_pair(N - 1, 0));
clouds.push_back(make_pair(N - 1, 1));
clouds.push_back(make_pair(N - 2, 0));
clouds.push_back(make_pair(N - 2, 1));
int d, s;
for (int i = 0; i < M; i++) {
cin >> d >> s;
move_and_rain(d - 1, s);
water_bug();
new_cloud();
}
int answer = 0;
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
answer += map[r][c];
}
}
cout << answer << "\n";
return 0;
}
728x90