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