본문 바로가기

백준

C++[백준]17143번 낚시왕

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

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다.

www.acmicpc.net

 

솔루션


시물레이션 + 수학 문제 인 것 같다.

 

나는 100*100 배열에 각각 상어의 특징을 넣었고,

 

각각의 인덱스를 확인하면서 상어의 위치 정보와 특징을 큐에 넣었다.

 

그리고 뽑으면서 상어의 이동 좌표를 계산해서 다시 배열에 넣어주었다. (이때 배열에 상어의 사이즈가 해당 상어 사이즈보다 크다면 넣지 않는다.)

 

이렇게 돌려주니, 맞았는데, 상어의 이동을 계산하는게 머리가 아팠다..;;

 

 

코드


#include <iostream>
#include <queue>
using namespace std;

struct shark {
	int speed, dir, size;
};
struct shark arr[102][102];

int N, M, k;
int sum;

struct pa {
	int r, c, s, d, z;
};

void calcAxis(struct pa& t) {
	if (t.s == 0) return;

	if (t.d == 1) {
		//위로 가는 경우
		if (t.r > t.s) {
			t.r -= t.s;
		}
		else {
			int tr = t.s - t.r + 1;
			if ((tr / (N-1)) & 1) {
				t.d = 1;
				t.r = N - tr % (N-1);
			}
			else {
				t.d = 2;
				t.r = tr % (N - 1) + 1;
			}
		}
	}
	else if (t.d == 2) {
		//아래로 가는 경우
		int tr = t.r + t.s - 1;
		if ((tr / (N - 1)) & 1) {
			t.d = 1;
			t.r = N - tr % (N - 1);
		}
		else {
			t.d = 2;
			t.r = tr % (N - 1) + 1;
		}
	}
	else if (t.d == 4) {
		//왼쪽
		if (t.c > t.s) {
			t.c -= t.s;
		}
		else {
			int tc = t.s - t.c + 1;
			if ((tc / (M-1)) & 1) {
				t.d = 4;
				t.c = M - tc % (M - 1);
			}
			else {
				t.d = 3;
				t.c = tc % (M - 1) + 1;
			}
		}

	}
	else if (t.d == 3) {
		//오른쪽
		int tc = t.c + t.s - 1;
		if ((tc / (M - 1)) & 1) {
			t.d = 4;
			t.c = M - tc % (M - 1);
		}
		else {
			t.d = 3;
			t.c = tc % (M - 1) + 1;
		}
	}
	return;
}

void move() {
	queue<struct pa> Q;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= M; j++) {
			if (arr[i][j].size != 0) {
				Q.push({ i,j,arr[i][j].speed,arr[i][j].dir,arr[i][j].size });
				arr[i][j].dir = arr[i][j].size = arr[i][j].speed = 0;
			}
		}
	}
	while (!Q.empty()) {
		struct pa t = Q.front();
		Q.pop();

		calcAxis(t);

		if (arr[t.r][t.c].size < t.z) {
			arr[t.r][t.c] = { t.s,t.d,t.z };
		}
	}
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> N >> M >> k;

	for (int i = 0; i < k; i++) {
		int r, c, s, d, z;
		cin >> r >> c >> s >> d >> z;
		arr[r][c] = { s,d,z };
	}

	for (int i = 1; i <= M; i++) {
		for (int j = 1; j <= N; j++) {
			if (arr[j][i].size != 0) {
				sum += arr[j][i].size;
				arr[j][i].dir = arr[j][i].size = arr[j][i].speed = 0;
				break;
			}
		}
		move();
	}

	cout << sum << "\n";
	return 0;
}

'백준' 카테고리의 다른 글

C++[백준]7579번 앱  (0) 2023.01.05
C++[백준]4386번 별자리 만들기  (2) 2023.01.05
C++[백준]10757번 큰 수 A + B  (0) 2023.01.03
C++[백준]10217번 KCM Travel  (0) 2023.01.03
C++[백준]1162번 도로포장  (0) 2023.01.03