백준 17143 낚시왕 - c++

JangGwon·2022년 7월 7일
0

삼성SW역량테스트

목록 보기
2/5

문제 링크 : https://www.acmicpc.net/problem/17143

문제설명

  1. 플레이어 위치를 오른쪽으로 이동시킨다.
  2. 플레이어와 같은 x축에 있는 상어중 가장 거리가 가까운 상어를 잡는다.
  3. 상어들이 이동한다.
  4. 플레이어가 오른쪽 끝까지 이동할 때까지 1~3번을 반복한다.

구현 문제라 딱히 어려운 부분은 없었다.

코드

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <vector>
#include <memory.h>
 
using namespace std;
 
int map[102][102];
int x,y,result;
int player_x = 0;
bool shocks[10001];
 
class Shark                 
{
    public:
    int x;
    int y;
    int speed;
    int dir;            // 1 위 // 2 아래 // 3 오른쪽 // 4 왼쪽                                                                                            
    int size;
    Shark(int x, int y, int speed, int dir, int size)
    {
        this->= x;
        this->= y;
        this->speed = speed;
        this->dir = dir;
        this->size = size;
    }
};
vector<Shark> v;
 
int eat_shark(int a,int b,int dir)              // 상어들이 겹쳤을때 상어 먹기
{
    if (v[a-1].size > v[b-1].size)
    {   
        //cout << v[b-1].size;
        shocks[b-1= true;
        return a;
    }
    else
    {
        //cout << v[a-1].size;
        shocks[a-1= true;
        v[b-1].dir = dir; 
        return b;
    }
}
void clear()                                // 맵에있는 값 초기화 해주는 함수
{
    for (int i = 1; i <= y; i++)
    {
        for (int j =1; j<= x; j++)
        {
            map[i][j] = 0;
        }
    }
}
void move_shark()                           // 상어가 움직일 때
{
    clear();
    //memset(map,0,sizeof(map));
    for (int i = 0; i < v.size(); i++)
    {
        int shark_x = v[i].x;
        int shark_y = v[i].y;
        int shark_dir = v[i].dir;
        int shark_speed = v[i].speed;
        int shark_power = v[i].size;
        while (shark_speed != 0)
        {
            if (shark_dir == 1)  // up
            {
                shark_y--;
                if (shark_y == 0)
                {
                    shark_y = 2;
                    shark_dir = 2;
                }
            }
            else if (shark_dir == 2)  // down
            {
                shark_y++;
                if (shark_y == y+1)
                {
                    shark_y = y-1;
                    shark_dir = 1;
                }
            }
            else if (shark_dir == 3)   // right 
            {
                if (shark_x == x)
                {
                    shark_x--;
                    shark_dir = 4;
                }
                else
                    shark_x++;
            }
            else if (shark_dir == 4)    // left
            {
                if (shark_x == 1)
                {
                    shark_x++;
                    shark_dir = 3;
                }
                else
                    shark_x--;
            }
            shark_speed--;
        }
        if (!map[shark_y][shark_x]) // 현재 위치에 상어가 없으면
        {              
            v[i].y = shark_y;
            v[i].x = shark_x;
            v[i].dir = shark_dir;
            map[shark_y][shark_x] = i + 1;
            //cout << v[map[shark_y][shark_x]].size;
        }
        else         // 현재 위치에 상어가 있으면
        {
            int c = eat_shark(map[shark_y][shark_x], i + 1, shark_dir);
            v[c-1].x = shark_x;
            v[c-1].y = shark_y;
            map[v[c-1].y][v[c-1].x] = c;
        }
    }
    vector<Shark> sh;
 
    for (int i = 0; i < v.size(); i++)
    {
        if(shocks[i])
        {
            shocks[i] = false;
        }
        else
        {
            sh.push_back(v[i]);
        }
    }
    v = sh;
}
 
void fish_shark()               // 상어 낚는 함수
{
    player_x++;
    int min = -1;
    int y = 101;
    for (int i = 0; i < v.size();i++)
    {
        if (v[i].x == player_x)
        {
            if (y > v[i].y)
            {
                min = i;
                y = v[i].y;
            }
        }
    }
    if (min != -1)               // 가까이있는 물고기 찾았으면 낚시
    {
     //   cout << "player_x : " << player_x << "  fish : " << v[min].size << endl;
        result += v[min].size;
        v.erase(v.begin() + min);
    }
 
}
void Simul()
{
    while (1)
    {
        if (player_x == x)      // 낚시꾼이 맨 오른쪽에 도착하면 끝 
        {
            cout << result;
            return ;
        }
        fish_shark();
        move_shark();
    }
}
 
int main()
{
    int shark_num;
   ios::sync_with_stdio(false);
   cin.tie(NULL);
    cin >> y >> x  >> shark_num;
    for (int i = 0; i < shark_num; i++)
    {
        int a, b, c, d, e;
        cin >> a >> b >> c >> d >> e;
        Shark sh = Shark(b,a,c,d,e);
        v.push_back(sh);
        map[a][b] = v.size();
    }
    if (shark_num == 0)
    {
        cout << "0";
        return 0;
    }
    Simul();
    return 0;
}
cs

0개의 댓글