[문제]
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PoOKKAPIDFAUq
[풀이]
1) 가장 높은 봉우리가 시작점이다.
2) 높은 지형에서 낮은 지형으로 가로 또는 세로 방향으로 연결이 되어야 한다.
3) 긴 등산로를 만들기 위해 딱 한 곳을 정해서 최대 K 깊이만큼 지형을 깎는 공사를 할 수 있다.
* 최대 K 라는 것을 알아야 한다. 꼭 K를 깎지 않아도 된다.
* dfs 사용 (깊이 우선 탐색)
* 시간 복잡도 O(n^2)
* 백트래킹 사용
* flag를 사용해서 이미 깎은 후인지 아니면 깎기 전인지 구별해서 탐색을 진행한다.
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
int map[8][8];
int n, k;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
bool visited[8][8];
int ans = 0;
void dfs(int x, int y, int cnt, int prev, bool flag)
{
visited[x][y] = true;
if (cnt > ans)
{
ans = cnt;
}
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= n || visited[nx][ny])
continue;
if (!flag)
{
//아직 깎지 않은 상태일 경우
if (map[nx][ny] < map[x][y])
{
dfs(nx, ny, cnt + 1, map[nx][ny], flag);
}
else
{
if (map[nx][ny]-k < map[x][y])
{
dfs(nx, ny, cnt + 1, map[x][y] - 1, true);
//'최대' K만큼 깎을 수 있다.=> K이하로도 깎을 수 있음을 고려해야한다.
//가장 높은 봉우리 높이 - 1을 prev로 설정한다.
//깎은 후의 높이를 최대로 설정하면 안됨.
//깎기 전의 높이를 최대로 설정해야 한다.
//(높이를 계속 바꾸면 안된다.)
}
}
}
else {
//깎은 상태의 경우
if (map[nx][ny] < prev)
dfs(nx, ny, cnt+1, map[nx][ny], flag);
}
}
visited[x][y] = false;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
for (int tc = 1; tc <= t; tc++)
{
cin >> n >> k; //자석 회전 횟수
int max = 0, cnt = 0, tmp;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> tmp;
map[i][j] = tmp;
if (max < map[i][j])
{
max = map[i][j];
}
}
}
ans = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (map[i][j] == max)
{
dfs(i, j, 1, map[i][j], false);
}
}
}
cout << "#" << tc << " " << ans << '\n';
}
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'SWEA > 삼성SW역량테스트 C++' 카테고리의 다른 글
[SWEA] 디저트가게 (0) | 2019.07.29 |
---|---|
[SWEA] 무선충전 (0) | 2019.07.29 |
[SWEA] 탈주범 검거 (0) | 2019.07.29 |
[SWEA] 홈 방범 서비스 (0) | 2019.07.29 |
[SWEA] 특이한 자석 (0) | 2019.07.28 |