할껀하고놀자

[백준] 17143번 낚시왕 본문

[IT]/백준

[백준] 17143번 낚시왕

working_hard 2019. 6. 11. 22:32
728x90
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;

const int Max = 100 + 1;
// 문제에서 상하우좌로 주어진다.
int dy[4] = { -1,1,0,0 };
int dx[] = { 0,0,1,-1 };

int R, C, M;
int arr[Max][Max];
// 크기 속도 방향
vector<pair<int, pair<int, int>>> shark[Max][Max];

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cin >> R >> C >> M;

	for (int i = 0; i < M; i++) {
		int r, c, s, d, z;
		cin >> r >> c >> s >> d >> z;
		shark[r][c].push_back({ z, {s,d - 1} });
	}
	int cur = 0;
	int result = 0;
	for (int c = 0; c < C; c++) {
		cur++;
		// 땅에서 가장 가까운 상어를 먹는다
		for (int i = 1; i <= R; i++) {
			if (shark[i][cur].size()) {	// 상어가 존재한다면
				result += shark[i][cur][0].first;	// 상어 크기를 결과값에 더해준다.
				shark[i][cur].clear();
				break;
			}
		}

		//r,c,z,s,d
		queue<pair<pair<int, int>, pair<int, pair<int, int>>>>q;
		for (int i = 1; i <= R; i++) {
			for (int j = 1; j <= C; j++) {
				if (shark[i][j].size()) {
					q.push({ {i,j},{shark[i][j][0]} });
					shark[i][j].clear();
					// 상어가 존재하면 큐에 넣고 공간 비워주기...
				}
			}
		}
		while (!q.empty()) {
			int y = q.front().first.first;
			int x = q.front().first.second;
			int size = q.front().second.first;
			int speed = q.front().second.second.first;
			int dir = q.front().second.second.second;
			q.pop();

			for (int i = 0; i < speed; i++) {
				// 위 아래 0 1
				if (dir == 0 || dir == 1) {
					int next = y + dy[dir];
					if (!(1 <= next && next <= R)) {
						dir = 1 - dir;
						// 방향 전환하는 방법인가봄..
					}
					y += dy[dir];
				}
				else {
					// 좌 우 2 3
					int next = x + dx[dir];
					if (!(1 <= next && next <= C)) {
						dir = 5 - dir;
					}
					x += dx[dir];
				}
			}

			// 이미 해당 칸에 상어가 존재할 경우에
			if (shark[y][x].size()) {
				// 해당 칸에 있는 상어의 크기보다 자기가 더 클 경우에만 대체한다.
				if (shark[y][x][0].first < size) {
					shark[y][x].clear();
					shark[y][x].push_back({ size,{speed,dir} });
				}
			}
			else {
				// 없으면 그냥 넣는다.
				shark[y][x].push_back({ size,{speed,dir} });
			}
		}
	}
	cout << result << endl;
	return 0;
}

'[IT] > 백준' 카테고리의 다른 글

[백준] 1786번 찾기 (KMP 알고리즘)  (0) 2019.09.09
[백준] 9012번 괄호  (0) 2019.08.14
[백준] 11365번 !밀비 급일  (0) 2019.06.10
[백준] 10773번 제로  (0) 2019.06.10
[백준] 2164번 카드2  (0) 2019.06.10
Comments