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

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다.

www.acmicpc.net

각 초마다 상어의 위치를 저장해주는 배열을 만들어주고 for문을 돌려준다. 이 때 주의할 점으로는 상어의 위치를 옮기기 전에 먼저 상어 한 마리를 잡아놓고 상어의 위치를 옮겨준다. 또한 상어가 원래 자기 자리로 돌아오는 것은 칸의 수마다 값이 바뀌는데 이는 칸의 개수 * 2 - 2이다. 따라서 이 값으로 s를 %연산해주고 나머지 s에 대해 계산해주면 되는데 본인은 현재 위치에서 s값을 갔을 때 끝에 값보다 작거나 같으면 그냥 나머지 s 값을 더해주는 방식으로 했다.

#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <memory.h>
#include <queue>
#include <vector>

#define endl '\n'
#define ll long long
#define pii pair<int, int>

using namespace std;

int R, C, M;
vector<pii> p[101];
vector<int> s(1);
vector<int> d(1);
vector<int> z(1);
int board[101][101];

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

	int tmp1, tmp2, tmp3, tmp4, tmp5;
	p[1].emplace_back(-1, -1);
	for (int i = 0; i < M; i++) {
		cin >> tmp1 >> tmp2 >> tmp3 >> tmp4 >> tmp5;
		p[1].emplace_back(tmp1, tmp2);
		s.push_back(tmp3);
		d.push_back(tmp4);
		z.push_back(tmp5);
	}
	//각 단계에서 가장 맨위에있는 애 뺴줘야함
	int r = 0, c = 0;
	int ans = 0;
	for (int i = 2; i <= C; i++) {
		int maxR = 101;
		int maxJ = 0;
		for (int j = 1; j <= M; j++) {
			if (p[i - 1][j].second == i - 1) {
				if (p[i - 1][j].first > 0 && maxR > p[i - 1][j].first) {
					maxR = p[i - 1][j].first;
					maxJ = j;
				}
			}
		}
		ans += z[maxJ];
		p[i - 1][maxJ].first = -1;
		p[i].emplace_back(-1, -1);
		for (int j = 1; j <= M; j++) {
			r = p[i - 1][j].first;
			c = p[i - 1][j].second;
			if (r == -1) {
				p[i].emplace_back(-1, -1);
				continue;
			}
			//이동 거리 축약해야됨
			int remind;
			if (d[j] == 1) {
				remind = s[j] % (R * 2 - 2);
				while (remind) {
					if (d[j] == 1) {
						if (r - remind >= 1) {
							r = r - remind;
							remind = 0;
						}
						else {
							remind = remind - (r - 1);
							r = 1;
							d[j] = 2;
						}
					}
					else {
						if (r + remind <= R) {
							r = r + remind;
							remind = 0;
						}
						else {
							remind = remind - (R - r);
							d[j] = 1;
							r = R;
						}
					}
				}
			}
			else if (d[j] == 2) {
				remind = s[j] % (R * 2 - 2);
				while (remind) {
					if (d[j] == 1) {
						if (r - remind >= 1) {
							r = r - remind;
							remind = 0;
						}
						else {
							remind = remind - (r - 1);
							r = 1;
							d[j] = 2;
						}
					}
					else {
						if (r + remind <= R) {
							r = r + remind;
							remind = 0;
						}
						else {
							remind = remind - (R - r);
							d[j] = 1;
							r = R;
						}
					}
				}
			}
			else if (d[j] == 3) {
				remind = s[j] % (C * 2 - 2);
				while (remind) {
					if (d[j] == 3) {
						if (c + remind <= C) {
							c = c + remind;
							remind = 0;
						}
						else {
							remind = remind - (C - c);
							d[j] = 4;
							c = C;
						}
					}
					else {
						if (c - remind >= 1) {
							c = c - remind;
							remind = 0;
						}
						else {
							remind = remind - (c - 1);
							d[j] = 3;
							c = 1;
						}
					}
				}
			}
			else {
				remind = s[j] % (C * 2 - 2);
				while (remind) {
					if (d[j] == 3) {
						if (c + remind <= C) {
							c = c + remind;
							remind = 0;
						}
						else {
							remind = remind - (C - c);
							d[j] = 4;
							c = C;
						}
					}
					else {
						if (c - remind >= 1) {
							c = c - remind;
							remind = 0;
						}
						else {
							remind = remind - (c - 1);
							d[j] = 3;
							c = 1;
						}
					}
				}
				
			}
			if (z[board[r][c]] < z[j]) {
				p[i][board[r][c]].first = -1;
				board[r][c] = j;
				p[i].emplace_back(r, c);

			}
			else {
				p[i].emplace_back(-1, -1);
			}
		}
		memset(board, 0, sizeof(board));
	}
	int maxR = 101;
	int maxJ = 0;
	for (int j = 1; j <= M; j++) {
		if (p[C][j].second == C) {
			if (p[C][j].first > 0 && maxR > p[C][j].first) {
				maxR = p[C][j].first;
				maxJ = j;
			}
		}
	}
	ans += z[maxJ];
	cout << ans << endl;

	return 0;
}

+ Recent posts