코딩테스트/C++
[ 백준 BOJ ] 17143번 - 낚시왕 (C++)
최-코드
2024. 4. 16. 15:43
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;
}