본문 바로가기
백준 알고리즘/구현

낚시왕 C++

by paysmile 2021. 10. 19.

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

 

17143번: 낚시왕

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

www.acmicpc.net

#include <iostream>
#include <cstring>
#include <vector>

using namespace std;
const int MAX = 105;
int r, c, m;
struct INFO { int r, c, s, d, z; }; //(r,c), s:속력, d:이동방향, z:크기
vector<INFO> map[MAX][MAX];
struct MOVE { int x, y; };
MOVE mv[5] = { {0,0}, {-1,0}, {1,0}, {0,1}, {0,-1} };
int loc = 1;
int answer = 0;

void EatFish() {
	for (int i = 1; i <= r; i++) {
		if (map[i][loc].size()>0) {
			answer += map[i][loc][0].z;
			map[i][loc].clear();
			break;
		}
	}
}

void MoveFish() {
	vector<INFO> tmp_m[MAX][MAX];

	for(int i=1; i<=r; i++){
		for (int j = 1; j <= c; j++) {
			if (map[i][j].size() > 0) {
				int movei = map[i][j][0].r;
				int movej = map[i][j][0].c;
				int s = map[i][j][0].s;
				int dir = map[i][j][0].d;
				//1:위, 2: 아래, 3:오른쪽, 4:왼쪽

				for (int k = 0; k < s; k++) {
					if (movei == 1 && dir == 1) {
						dir = 2;
					}
					else if (movei == r && dir == 2) {
						dir = 1;
					}

					if (movej == 1 && dir == 4) {
						dir = 3;
					}
					else if (movej == c && dir == 3) {
						dir = 4;
					}
					movei = movei + mv[dir].x;
					movej = movej + mv[dir].y;
				}

				if (tmp_m[movei][movej].size() == 0) {
					tmp_m[movei][movej].push_back({ movei,movej,s,dir,map[i][j][0].z });
				}
				else {
					if (tmp_m[movei][movej][0].z < map[i][j][0].z) {
						tmp_m[movei][movej].clear();
						tmp_m[movei][movej].push_back({ movei,movej,s,dir,map[i][j][0].z });
					}
				}
			}
		}
	}
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			map[i][j] = tmp_m[i][j];
		}
	}
}

int main(void) {
	cin >> r >> c >> m;

	for (int i = 0; i < m; i++) {
		int R, C, s, d, z;
		cin >> R >> C >> s >> d >> z;
		if (d == 1 || d == 2) s %= ((r - 1) * 2);
		if (d == 3 || d == 4) s %= ((c - 1) * 2);
		map[R][C].push_back({ R,C,s,d,z });
	}

	for (int i = 1; i <= c; i++) {
		EatFish();
		MoveFish();
		loc++;
	}
	cout << answer << endl;
}

'백준 알고리즘 > 구현' 카테고리의 다른 글

인구 이동 C++  (0) 2021.10.19
나무 재테크 C++  (0) 2021.10.19
이차원 배열과 연산 C++  (0) 2021.10.19
게리멘더링 2 C++  (0) 2021.10.17
주사위 윷놀이 C++  (0) 2021.10.16