알고리즘/백준

[백준 1405] 미친 로봇 C++

겜도리도리 2021. 11. 15. 23:52
반응형

문제

백준 1405 미친 로봇 C++

 

1405번: 미친 로봇

첫째 줄에 N, 동쪽으로 이동할 확률, 서쪽으로 이동할 확률, 남쪽으로 이동할 확률, 북쪽으로 이동할 확률이 주어진다. N은 14보다 작거나 같은 자연수이고,  모든 확률은 100보다 작거나 같은 자

www.acmicpc.net

풀이

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[] = { -1100 };
int dy[] = { 00-11 };
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(505010);
    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