본문 바로가기
카테고리 없음

[백준] 20056번 : 마법사 상어의 파이어볼 (삼성 역량 SW기출)

by 루시킴 2021. 10. 20.

https://www.acmicpc.net/problem/20056

 

20056번: 마법사 상어와 파이어볼

첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치

www.acmicpc.net

#include <iostream>
#include <queue>
using namespace std;

struct Node {
public:
	int mass; //질량 
	int dir; //방향
	int speed; //속도
	Node(int mass, int speed, int dir) {
		this->mass = mass;
		this->speed = speed;
		this->dir = dir;
	}
};

int N, M, K;
int r, c, m, s, d;
queue<Node> map[51][51];
int dx[8] = { -1,-1,0,1,1,1,0,-1 };
int dy[8] = { 0,1,1,1,0,-1,-1,-1 };
int newDir[8] = { 0,2,4,6,1,3,5,7 };
int result;



int main() {
	cin >> N >> M >> K;

	for (int i = 0; i < M; i++) {
		cin >> r >> c >> m >> s >> d;
		map[r][c].push(Node(m, s, d));
	}

	while (K--) {
		result = 0;
		queue<Node> map_cp[51][51];
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				if (!map[i][j].empty()) {
					int size = map[i][j].size();
					for (int k = 0; k < size; k++) {
						Node cur = map[i][j].front();
						map[i][j].pop();
						int cx=i, cy=j;
						for (int t = 0; t < cur.speed; t++) {
							cx+=dx[cur.dir];
							cy+= dy[cur.dir];
							if (cx <= 0) cx += N;
							else if (cx > N) cx -= N;
							if (cy <= 0) cy += N;
							else if (cy > N) cy -= N;
						}
						map_cp[cx][cy].push(cur);
					}
				}
			}
		}
		for (int i = 1; i <= N; i++) {//복사
			for (int j = 1; j <= N; j++) {
				if (!map_cp[i][j].empty()) {
					int size = map_cp[i][j].size();
					while (size--) {
						map[i][j].push(map_cp[i][j].front());
						map_cp[i][j].pop();
					}
				}
			}
		}

		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				if (map[i][j].size() >= 2) {
					int Msum = 0;
					int Ssum = 0;
					bool flag = true; //모두 홀수 or 짝수 
					int dir = -1;
					int cnt = map[i][j].size();
					for (int k = 0; k < cnt; k++) {
						Node cur = map[i][j].front();
						map[i][j].pop();
						Msum += cur.mass;
						Ssum += cur.speed;
						if (k == 0) dir = cur.dir % 2;
						else if (flag) {
							if (cur.dir % 2 != dir) flag = false;
						}
					}
					if (Msum / 5 == 0) continue;
					int start = -1;
					if (flag) start = 0; //모두 홀수나 짝수면
					else start = 4;
					for (int k = start; k < start + 4; k++) {
						map_cp[i][j].push(Node(Msum / 5, Ssum / cnt, newDir[k]));
						result += Msum / 5;
					}
				}
				else if (map[i][j].size() == 1) {
					result += map[i][j].front().mass;
					map_cp[i][j].push(map[i][j].front());
					map[i][j].pop();
					
				}
			}
		}
		for (int i = 1; i <= N; i++) {//복사
			for (int j = 1; j <= N; j++) {
				if (!map_cp[i][j].empty()) {
					int size = map_cp[i][j].size();
					while (size--) {
						map[i][j].push(map_cp[i][j].front());
						map_cp[i][j].pop();
					}
				}
			}
		}

	}
	cout << result << endl;

}

댓글