Post

[BOJ] 19236 - 청소년상어

[백준] 19236 - 청소년상어

재귀를 반복하면서 계속해서 새로운 배열을 생성해야 하기 때문에 메모리 초과가 날 수도 있다고 생각해 걱정했던 코드다.
다행히 재귀 깊이가 최대 16이기 때문에 우려하던 문제는 발생하지 않았다.
주어진 대로 충실히 구현하고, 최댓값은 가능한 모든 경우의 수를 DFS방식으로 탐색하고 반환된 값 중에 최댓값을 선택하여 반환하여 구해주었다.

소스코드
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <queue>
using namespace std;
typedef pair<int, int> PII;

const int dr[8] = { -1, -1, 0, 1, 1, 1, 0, -1 }, dc[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
int k;
vector<vector<int>> fild;
vector<PII> mouse;
vector<int> to;

bool is_in_range(int x, int y) {
	return x >= 0 && x < 4 && y >= 0 && y < 4;
}

void mouse_move(vector<vector<int>> &fild, vector<PII> &mouse, vector<int> &to, int x, int y) {
	for (int i = 1; i <= 16; i++) {
		if (mouse[i].first == -1) continue;
		int xx = mouse[i].first, yy = mouse[i].second;
		while (true) {
			int r = xx + dr[to[i]], c = yy + dc[to[i]];
			if (is_in_range(r, c) && (r != x || c != y)) { // 이동이 가능한 경우
				if (fild[r][c] != 0) {
					swap(mouse[i], mouse[fild[r][c]]);
					swap(fild[r][c], fild[xx][yy]);
				}
				else {
					fild[r][c] = fild[xx][yy];
					fild[xx][yy] = 0;
					mouse[i] = { r,c };
				}
				break;
			}
			else {
				to[i]++;
				if (to[i] >= 8) to[i] -= 8;
			}

		}
	}
}

int go(vector<vector<int>> fild, vector<PII> mouse, vector<int> to, int x, int y) {
	int rtn = fild[x][y], now = fild[x][y];
	fild[x][y] = 0;
	mouse[now] = { -1, -1 };
	mouse_move(fild, mouse, to, x, y);
	for (int i = 1; i < 4; i++) {
		int r = x + i * dr[to[now]], c = y + i * dc[to[now]];
		if (is_in_range(r, c) && fild[r][c] != 0) {
			rtn = max(rtn, now + go(fild, mouse, to, r, c));
		}
	}
	return rtn;
}

int main(void) {
	to.resize(20);
	mouse.resize(20);
	fild.resize(4);
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			int a, b;
			scanf("%d %d", &a, &b);
			fild[i].push_back(a);
			mouse[a] = { i, j };
			to[a] = b - 1;
		}
	}
	printf("%d", go(fild, mouse, to, 0, 0));
	return 0;
}
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.