[17143] 낚시왕
풀이
- 5개의 int로 구성된 tuple로 풀었더니 너무 느리다. struct를 사용해서 풀이를 작성하자.
typedef struct _shark{
int y;
int x;
int speed;
int dir;
int size;
bool alive;
} Shark;
-
tuple(int,int,int)map[101][101]로 하니까 매번 tie(a,b,c)를 해줘야해서 너무 느리다. int map[i][j]에는 크기가 k인 물고기가 위치한다고 배열을 저장하자.
-
아주 맘에 드는 풀이 https://www.acmicpc.net/source/14212010
내 코드
정답이지만, 3시간 만에 맞췄고, 느리다. ㅠㅠ tuple 개느리네 하.
#include <cstdio>
#include <vector>
#include <tuple>
#include <algorithm>
#include <cstring>
using namespace std;
#define UP 1
#define DOWN 2
#define RIGHT 3
#define LEFT 4
int dx[] = { -1,1,0,0};
int dy[] = { 0,0,1,-1};
int r = 0, c = 0, m = 0;
int x = 0, y = 0, s = 0, d = 0, z = 0;
long long ans = 0;
tuple<int, int, int> map[101][101];
bool check[101][101];
void printShark(void) {
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
if (check[i][j]) printf("1 ");
else printf("0 ");
}
printf("\n");
}
}
int main(void) {
scanf("%d%d%d", &r, &c, &m);
for (int i = 0; i < m; i++) {
scanf("%d%d%d%d%d", &x, &y, &s, &d, &z);
map[x][y] = make_tuple(s, d, z);
check[x][y] = true;
}
//사람의 위치
int ts = 0, td = 0, tz = 0;
for (int man = 1; man <= c; man++) {
//printf("상어 잡기 전\n");
//printShark();
//가까운 상어 잡기
for (int row = 1; row <= r; row++) {
if (check[row][man]) {
tie(ts, td, tz) = map[row][man];
ans += tz;
check[row][man] = false;
map[row][man] = tuple<int, int, int>();
break;
}
}
//printf("상어 잡은 후\n");
//printShark();
//상어 움직이기
int nx = 0, ny = 0;
vector<tuple<int, int, int, int, int> > v;
vector<tuple<int, int, int, int, int> >::iterator it;
for (int row = 1; row <= r; row++) {
for (int col = 1; col <= c; col++) {
if (check[row][col]) {
tie(ts, td, tz) = map[row][col];
map[row][col] = tuple<int, int, int>();
check[row][col] = false;
nx = row; ny = col;
//printf("%d, %d에서 ", nx, ny);
//printf(" ts %d마큼 움직여서 ", ts);
//움직여야하는 만큼
for (int idx = 0; idx < ts; idx++) {
//방향 바꾸기
if (nx + dx[td - 1] <1 || nx + dx[td - 1] > r) {
if (td == UP) td = DOWN;
else td = UP;
}
if (ny + dy[td - 1] <1 || ny + dy[td - 1] > c) {
if (td == LEFT) td = RIGHT;
else td = LEFT;
}
//움직이기
nx += dx[td - 1];
ny += dy[td - 1];
}
//printf("%d, %d으로 \n", nx, ny);
v.push_back(make_tuple(nx,ny,ts,td,tz));
}
}
}
//전체 초기화
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= c; j++) {
map[i][j] = tuple<int, int, int>();
check[i][j] = false;
}
}
//상어 위치 그리기
for (it = v.begin(); it != v.end(); it++) {
tie(nx, ny, ts, td, tz) = *it;
if(!check[nx][ny]) map[nx][ny] = make_tuple(ts, td, tz);
else {
int as = 0, ad = 0, az = 0;
tie(as, ad, az) = map[nx][ny];
if (tz > az) {
map[nx][ny] = make_tuple(ts, td, tz);
}
}
check[nx][ny] = true;
}
//printf("움직인 후\n");
//printShark();
}
printf("%lld\n", ans);
return 0;
}