기술 블로그

17143번 낚시왕 본문

알고리즘 문제/BOJ

17143번 낚시왕

parkit 2019. 4. 16. 01:17
728x90
반응형

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



핵심은 시작부터


물고기가 끝 점(R or C) 또는 시작점(1)에 있을 수 있다.


예를 들어, 1에 있고 방향이 위로 향해있으면 아래로 고쳐줘야한다.

물론 1에 있지만 방향이 아래면 굳이 고칠 필요가 없다.


또한, 굳이 정렬을 사용할 필요가 없었다.



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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <bits/stdc++.h>
 
using namespace std;
 
typedef struct info
{
    int s = 0, d = 0, z = 0// 미리 0으로 초기화
}info;
 
int R, C, M; // 행, 열
 
int dy[5= { 0-1100 }; // 1상, 2하, 3우, 4좌
int dx[5= { 0001-1 };
 
info fish[101][101];
 
int simulation()
{
    int ret = 0;
 
    for (int t = 1; t <= C; t++
    {
        info temp[101][101];
 
        // 낚시
        for (int r = 1; r <= R; r++)
            if (fish[r][t].z)
            {
                ret += fish[r][t].z;
                fish[r][t].z = 0;
                break;
            }    
 
        // 물고기 이동
        for (int i = 1; i <= R; i++)
            for (int j = 1; j <= C; j++)            
                if (fish[i][j].z)
                {
                    int moving, y = i, x = j;
 
                    if (fish[i][j].d <= 2// 상, 하
                    {
                        moving = fish[i][j].s % (2 * (R - 1));
 
                        while (moving--)
                        {        
                            if (y == 1 && fish[i][j].d == 1) fish[i][j].d = 2;
                            if (y == R && fish[i][j].d == 2) fish[i][j].d = 1;                    
 
                            y += dy[fish[i][j].d];                    
                        }                    
                    }
                    else // 좌, 우
                    {
                        moving = fish[i][j].s % (2 * (C - 1));
 
                        while (moving--)
                        {
                            if (x == C && fish[i][j].d == 3) fish[i][j].d = 4;
                            if (x == 1 && fish[i][j].d == 4) fish[i][j].d = 3;                    
 
                            x += dx[fish[i][j].d];                
                        }
                    }
 
                    if (temp[y][x].z < fish[i][j].z) // 만약 더 큰 물고기가 있었다면
                        temp[y][x] = fish[i][j];
 
                    fish[i][j] = { 000 };
                }
        
        for (int i = 1; i <= R; i++)
            for (int j = 1; j <= C; j++)
                fish[i][j] = temp[i][j];
    }
 
    return ret;
}
 
int main(void)
{
    int r, c, s, d, z;
 
    scanf("%d %d %d"&R, &C, &M);
 
    for (int i = 0; i < M; i++
    {
        scanf("%d %d %d %d %d"&r, &c, &s, &d, &z);
        fish[r][c] = { s, d, z };
    }
 
    printf("%d\n", simulation());
 
    return 0;
}
cs






728x90
반응형

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

16987번 계란으로 계란치기  (4) 2019.04.16
17142번 연구소 3  (0) 2019.04.16
17141번 연구소 2  (0) 2019.04.15
2744번 대소문자 바꾸기  (0) 2019.04.14
16938번 캠프 준비  (0) 2019.04.14