문제 : https://www.acmicpc.net/problem/17143
[ 알고리즘풀이 ]
1. 사냥꾼이 현재 열에서 행을 순회하며 상어가 있다면 잡습니다.
2. 상어를 전체적으로 이동해줍니다.
- 현재 상어의 위치와 이동한 상어의 위치를 따로 저장해줘야되므로 tempMap을 선언해 이동한 상어의 위치를 따로 저장해준 후, 이동이 끝나고 현재 map에 copy 해줍니다.
- 상어의 이동은 방향이 1, 2(위 아래)로 움직일 때는 (R - 1) * 2 씩 움직이는 것은 제자리로 돌아오므로 현재 상어의 velocity % ( (R - 1) * 2 ) 만큼만 실제로 이동해주면 되고, 방향이 3, 4( 오른쪽 왼쪽)으로 움직일 때는 (C - 1) * 2 씩 움직이는 것을 제자리로 돌아오므로 현재 상어의 velocity % ( ( C - 1) * 2 ) 만큼만 이동해주면 됩니다.
- 현재 위치( x, y ) 가 경계선에 닿아있고, 방향이 벽을 향하고 있다면 방향을 반대로 돌려줍니다.
- dx[5] = { 0, -1, 1, 0, 0, }, dy[5] = { 0, 0, 0, 1, -1 } 배열을 이용하면 현재 위치 ( x, y )에서 방향이 d일 때 다음 위치는 ( x + dx[d], y + dy[d] ) 로 쉽게 구할 수 있습니다.
#include<iostream>
using namespace std;
typedef struct shark {
int velocity, dir, size;
};
shark map[101][101] = {};
int R, C, M, ans = 0, a, b, c, d, e, dx[5] = { 0, -1, 1, 0, 0 }, dy[5] = { 0, 0, 0, 1, -1 };
void moveShark(void) {
shark tempMap[101][101] = {};
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
if (map[i][j].size != 0) { //상어가 있다면 이동.
int x = i, y = j, s = map[i][j].velocity, d = map[i][j].dir;
if (d <= 2)
s = s % ((R - 1) * 2);
else
s = s % ((C - 1) * 2);
for (int k = 0; k < s; k++) {
if (x == 1 && d == 1)
d = 2;
if (x == R && d == 2)
d = 1;
if (y == 1 && d == 4)
d = 3;
if (y == C && d == 3)
d = 4;
x += dx[d];
y += dy[d];
}
if (tempMap[x][y].size < map[i][j].size)
tempMap[x][y] = { map[i][j].velocity, d, map[i][j].size };
}
}
}
for (int i = 1; i <= R; i++)
for (int j = 1; j <= C; j++)
map[i][j] = tempMap[i][j];
return;
}
void getFish(int j) {
for (int i = 1; i <= R; i++) {
if (map[i][j].size != 0) {
ans += map[i][j].size;
map[i][j] = { 0, 0, 0 };
break;
}
}
}
void playFishing(void) {
// j는 현재 낚시꾼 위치.
for (int j = 1; j <= C; j++) {
// 낚시를 한다.
getFish(j);
// 상어들 이동.
moveShark();
}
return;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> R >> C >> M;
for (int i = 0; i < M; i++) {
cin >> a >> b >> c >> d >> e;
map[a][b] = { c,d,e };
}
playFishing();
cout << ans;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 12865 : 평범한 배낭 - travelbeeee (0) | 2020.02.28 |
---|---|
[BOJ] 17140 : 이차원 배열과 연산 - travelbeeee (0) | 2020.02.28 |
[BOJ] 15683 : 드래곤 커브 - travelbeeee (0) | 2020.02.26 |
[BOJ] 13305 : 주유소 - travelbeeee (0) | 2020.02.25 |
[BOJ] 11576 : Base Conversion - travelbeeee (0) | 2020.02.25 |