코딩공작소

[백준]낚시왕(2) 본문

알고리즘/그래프

[백준]낚시왕(2)

안잡아모찌 2019. 9. 28. 21:17

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

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. 칸에는 상어가 최대 한 마리 들어있을 수 있다. 상어는 크기와 속도를 가지고 있다. 낚시왕은 처음에 1번 열의 한 칸 왼쪽에 있다. 다음은 1초 동안 일어나는 일이며, 아래 적힌 순서대로 일어난다. 낚시왕은 가장 오른쪽 열의 오른쪽 칸에 이동하

www.acmicpc.net

시뮬시뮬. 주기와 struct 2차배열에 대해 공부한거 같다.

 

B물고기에 대한 이동에 대해 나타내보면 위와 같이 설명될 수 있다.
H물고기의 이동에 대한 주기 파악

 

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, 0sizeof(map));
        
        for (int r = 1; r <= R; r++for (int c = 1; c <= C; c++) {
            if (back[r][c].z == 0continue;
            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