https://www.acmicpc.net/problem/17143
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int MAX = 105;
int r, c, m;
struct INFO { int r, c, s, d, z; }; //(r,c), s:속력, d:이동방향, z:크기
vector<INFO> map[MAX][MAX];
struct MOVE { int x, y; };
MOVE mv[5] = { {0,0}, {-1,0}, {1,0}, {0,1}, {0,-1} };
int loc = 1;
int answer = 0;
void EatFish() {
for (int i = 1; i <= r; i++) {
if (map[i][loc].size()>0) {
answer += map[i][loc][0].z;
map[i][loc].clear();
break;
}
}
}
void MoveFish() {
vector<INFO> tmp_m[MAX][MAX];
for(int i=1; i<=r; i++){
for (int j = 1; j <= c; j++) {
if (map[i][j].size() > 0) {
int movei = map[i][j][0].r;
int movej = map[i][j][0].c;
int s = map[i][j][0].s;
int dir = map[i][j][0].d;
//1:위, 2: 아래, 3:오른쪽, 4:왼쪽
for (int k = 0; k < s; k++) {
if (movei == 1 && dir == 1) {
dir = 2;
}
else if (movei == r && dir == 2) {
dir = 1;
}
if (movej == 1 && dir == 4) {
dir = 3;
}
else if (movej == c && dir == 3) {
dir = 4;
}
movei = movei + mv[dir].x;
movej = movej + mv[dir].y;
}
if (tmp_m[movei][movej].size() == 0) {
tmp_m[movei][movej].push_back({ movei,movej,s,dir,map[i][j][0].z });
}
else {
if (tmp_m[movei][movej][0].z < map[i][j][0].z) {
tmp_m[movei][movej].clear();
tmp_m[movei][movej].push_back({ movei,movej,s,dir,map[i][j][0].z });
}
}
}
}
}
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
map[i][j] = tmp_m[i][j];
}
}
}
int main(void) {
cin >> r >> c >> m;
for (int i = 0; i < m; i++) {
int R, C, s, d, z;
cin >> R >> C >> s >> d >> z;
if (d == 1 || d == 2) s %= ((r - 1) * 2);
if (d == 3 || d == 4) s %= ((c - 1) * 2);
map[R][C].push_back({ R,C,s,d,z });
}
for (int i = 1; i <= c; i++) {
EatFish();
MoveFish();
loc++;
}
cout << answer << endl;
}
'백준 알고리즘 > 구현' 카테고리의 다른 글
인구 이동 C++ (0) | 2021.10.19 |
---|---|
나무 재테크 C++ (0) | 2021.10.19 |
이차원 배열과 연산 C++ (0) | 2021.10.19 |
게리멘더링 2 C++ (0) | 2021.10.17 |
주사위 윷놀이 C++ (0) | 2021.10.16 |