티스토리 뷰

알고리즘/BOJ

[BOJ 17143] 낚시왕

히더 2019. 5. 14. 21:28

백준 :: BOJ :: 17143 :: 낚시왕

 

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

 

#include<bits/stdc++.h>
using namespace std;

#define FO(x,y) for(x=0; x<y; x++)
struct F { int r, c, d, s, z; }; vector<F> v;
int R, C, M, ans, dir[2][5] = { { 0,-1,1,0,0 },{ 0,0,0,1,-1 } }, cd[] = { 0,2,1,4,3 };

inline int go(int a, int b, int c, int e) {
	int pm = (b + (v[a].s*dir[e][v[a].d])), tm = abs(pm) % ((c - 1) * 2);
	if (v[a].s) {
		if (v[a].d == 1 || v[a].d == 4) { if (tm > 0 && tm < c) if (pm < 0) v[a].d = cd[v[a].d]; }
		else { if (tm == 0 || tm > (c - 1)) v[a].d = cd[v[a].d]; }
	}
	return (tm > (c - 1) ? ((c - 1) * 2) - tm : tm);
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0);
	cin >> R >> C >> M; F f;
	while (M--) { cin >> f.r >> f.c >> f.s >> f.d >> f.z; f.r--; f.c--; v.push_back(f); }
	for (int k = 0; k < C && v.size(); k++) {
		F p[100][100] = { 0, }; vector<int>pv[2]; int fc[2] = { 101, }, i, vi[100][100] = { 0, };
		FO(i, v.size()) { if (v[i].c == k && fc[0] > v[i].r) { fc[0] = v[i].r; fc[1] = v[i].z; } }
		FO(i, v.size()) {
			if (v[i].z == fc[1]) { ans += v[i].z; v.erase(v.begin() + i); i--; continue; }
			int ni = v[i].r, nj = v[i].c;
			if (v[i].d < 3) ni = go(i, ni, R, 0);
			else nj = go(i, nj, C, 1);
			if (p[ni][nj].z < v[i].z) {
				v[i].r = ni; v[i].c = nj; p[ni][nj] = v[i]; if (!vi[ni][nj]) { vi[ni][nj] = 1; pv[0].push_back(ni); pv[1].push_back(nj); };
			}
		}v.clear();
		FO(i, pv[0].size()) v.push_back(p[pv[0][i]][pv[1][i]]);
	}
	cout << ans;
	return 0;
}

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ 17142] 연구소 3  (0) 2019.09.18
[BOJ 17140] 이차원 배열과 연산  (0) 2019.09.18
[BOJ 17144] 미세먼지 안녕!  (2) 2019.05.14
[BOJ 3190] 뱀  (0) 2019.01.21
[BOJ 16235] 나무 재테크  (0) 2019.01.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함