너무 오랜만에 풀어보는 ..
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct node {
int y, x;
};
int n, m, d, s;
vector<node> cloud;
vector<int> info[101];
vector<int> map[51];
bool chkOldCloud[51][51];
int dy[8] = { 0,-1,-1,-1,0,1,1,1 }; //서쪽부터 대각포함 시계방향
int dx[8] = { -1,-1,0,1,1,1,0,-1 };
int bugDirY[4] = { -1,1,1,-1 };
int budDirX[4] = { 1,1,-1,-1 };
void printMap();
void move(int d, int s);
void initCloud();
void printCloud();
void rain();
void waterCopyBug();
void makeCloud();
void initChkOldCloud();
int getResult();
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int tmp;
cin >> tmp;
map[i].push_back(tmp);
}
}
for (int i = 0; i < m; i++) {
cin >> d >> s;
info[i].push_back(d-1);
info[i].push_back(s);
}
initCloud();
//printCloud();
for (int i = 0; i < m; i++) {
initChkOldCloud(); //구름 존재했는지 체크 map 초기화
move(info[i][0], info[i][1]);
rain(); //비내리고 구름있던 부분 체크
//printMap();
waterCopyBug(); //물복사 하고 현재 위치 구름 없애기
makeCloud();
}
int result = getResult();
cout << result;
}
void rain() {
for (int i = 0; i < cloud.size(); i++) {
map[cloud[i].y][cloud[i].x] += 1;
chkOldCloud[cloud[i].y][cloud[i].x] = true;
}
}
void initCloud() {
cloud.push_back({ n - 1, 0 });
cloud.push_back({ n - 1,1 });
cloud.push_back({ n - 2,0 });
cloud.push_back({ n - 2,1 });
}
void printCloud() {
cout << "where clouds? num: " << cloud.size() << '\n';
for (int i = 0; i < cloud.size(); i++) {
cout << cloud[i].y << ',' << cloud[i].x << '\n';
}
}
void move(int d, int s) {
//cout << "==after move==\n";
int cSize = cloud.size();
for (int i = cSize-1; i >= 0; i--) {
int nx = cloud[i].x;
int ny = cloud[i].y;
//cout << "cloud: " << ny << ',' << nx << '\n';
for (int j = 1; j <= s; j++) {
nx += dx[d];
ny += dy[d];
if (nx < 0) {
nx = n - 1;
}
if (ny < 0) {
ny = n - 1;
}
if (nx >= n) {
nx = 0;
}
if (ny >= n) {
ny = 0;
}
}
cloud[i].x = nx;
cloud[i].y = ny;
}
//printCloud();
}
void printMap() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << map[i][j] << ' ';
}
cout << '\n';
}
}
//이동된 구름에서 비와서 +1 되었고, 물복사버그 시전하면서 구름없애버리자
void waterCopyBug() {
//cout << "===waterCopyBug===\n";
for (int i = 0; i<cloud.size(); i++) {
int x = cloud[i].x;
int y = cloud[i].y;
//cout << "cloud: (" << y << ',' << x << ")\n";
int waterCnt = 0;
for (int j = 0; j < 4; j++) {
int nx = x + budDirX[j];
int ny = y + bugDirY[j];
if (ny < 0 || nx < 0 || ny >= n || nx >= n) continue;
if (!map[ny][nx]) continue;
waterCnt++;
}
//cout << "waterCnt: " << waterCnt << "\n";
map[y][x] += waterCnt;
}
//printMap();
cloud.clear();
}
void makeCloud() {
//cout << "===makeCloud===\n";
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (chkOldCloud[i][j]) continue; //이전에 구름이였던 자리면 생기면 안됌
if (map[i][j] < 2) continue;
map[i][j] -= 2;
cloud.push_back({ i,j });
}
}
//printCloud();
//printMap();
}
void initChkOldCloud() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
chkOldCloud[i][j] = false;
}
}
}
int getResult() {
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!map[i][j]) continue;
res += map[i][j];
}
}
return res;
}

ㅎ