코딩공작소
[백준]낚시왕(2) 본문
https://www.acmicpc.net/problem/17143
17143번: 낚시왕
낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. 칸에는 상어가 최대 한 마리 들어있을 수 있다. 상어는 크기와 속도를 가지고 있다. 낚시왕은 처음에 1번 열의 한 칸 왼쪽에 있다. 다음은 1초 동안 일어나는 일이며, 아래 적힌 순서대로 일어난다. 낚시왕은 가장 오른쪽 열의 오른쪽 칸에 이동하
www.acmicpc.net
시뮬시뮬. 주기와 struct 2차배열에 대해 공부한거 같다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <iostream>
#include <cstring>
using namespace std;
struct Shark {
int s, d, z;
};
int R, C, M, ans = 0;
Shark map[101][101], back[101][101];
int dr[] = { 0,-1,1,0,0 }, dc[] = { 0,0,0,1,-1 };//1위 2아래 3오른쪽 4왼쪽
void solve() {
for (int t = 1; t <= C; t++) {
//상어 잡기
for (int r = 1; r <= R; r++) {
if (map[r][t].z != 0) { ans += map[r][t].z, map[r][t] = { 0,0,0 }; break; }
}
memcpy(back, map, sizeof(back)); memset(map, 0, sizeof(map));
for (int r = 1; r <= R; r++) for (int c = 1; c <= C; c++) {
if (back[r][c].z == 0) continue;
int speed = back[r][c].s;
int dir = back[r][c].d;
int nr = r, nc = c;
if (dir == 1 || dir == 2) {
speed %= 2 * (R - 1);
while (speed--) {
if (nr == 1 && dir == 1) dir = 2;
if (nr == R && dir == 2) dir = 1;
nr += dr[dir];
}
}
else if (dir == 3 || dir == 4) {
speed %= 2 * (C - 1);
while (speed--) {
if (nc == 1 && dir == 4) dir = 3;
if (nc == C && dir == 3) dir = 4;
nc += dc[dir];
}
}
if (map[nr][nc].z < back[r][c].z) map[nr][nc] = { back[r][c].s,dir,back[r][c].z };
}
}
printf("%d\n", ans);
}
int main() {
ios::sync_with_stdio(false); cin.tie(NULL);
cin >> R >> C >> M;
for (int i = 0; i < M; i++) {
int r, c, s, d, z;
cin >> r >> c >> s >> d >> z;
map[r][c] = { s,d,z };
}
solve();
return 0;
}
|
cs |
'알고리즘 > 그래프' 카테고리의 다른 글
[백준]달이차오른다,가자 (0) | 2019.10.08 |
---|---|
[백준]영역구하기 (0) | 2019.10.08 |
[백준]아기상어(3) (0) | 2019.09.28 |
[SWEA]탈주범검거 (0) | 2019.09.28 |
[백준]벽부수고이동하기 (0) | 2019.09.21 |