반응형
문제
풀이
DFS를 활용하여 전체 탐색합니다.
4^14이라 시간 초과가 발생할 것 같지만, 중간에 경로가 겹치면 그 이후 경로는 탐색하지 않는 식으로 접근하면 더 빨리 해결이 가능합니다.
소스 코드
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
|
#include <iostream>
using namespace std;
// 명령 개수, 북남서동 확률
int N;
double proArr[4];
double simple;
int dx[] = { -1, 1, 0, 0 };
int dy[] = { 0, 0, -1, 1 };
bool visited[100][100];
void dfs(int x, int y, double probaility, int cnt) {
// 경로 겹치면 return
if (visited[y][x]) {
return;
}
visited[y][x] = true;
// cnt만큼 움직였는데 겹치지 않았으면 simple에 지금까지의 확률 더해주기
if (cnt == N) {
simple += probaility;
visited[y][x] = false;
return;
}
// 북남서동 확인
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
dfs(nx, ny, probaility * proArr[i], cnt + 1);
}
visited[y][x] = false;
}
int main()
{
cout << fixed;
cout.precision(18);
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for (int i = 0; i < 4; i++) {
double prob;
cin >> prob;
proArr[i] = prob / 100.0;
}
dfs(50, 50, 1, 0);
cout << simple;
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 2096] 내려가기 C++ (0) | 2021.11.22 |
---|---|
[백준 1339] 단어 수학 C++ (0) | 2021.11.15 |
[백준 2023] 신기한 소수 C++ (0) | 2021.11.10 |
[백준 1504] 특정한 최단 경로 (0) | 2021.11.06 |
[백준 17298] 오큰수 C++ (0) | 2021.11.04 |