본문 바로가기
알고리즘

BOJ 1405 - 미친로봇(C++)

by 장중앙 2021. 8. 24.

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

 

1405번: 미친 로봇

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

www.acmicpc.net

풀이

N이 14보다 작거나 같기 때문에 시작점을 (14, 14)로 설정

dfs를 사용하여 해당방향으로 갈 확률을 곱해주는 방식으로 진행

더보기

ex) 테스트 케이스 N=2, [25, 25, 25, 25]의 경우 :

  (동서남북의 확률이 같아 처음 한방향의 확률값 x 4로 계산 가능)

  1/4 x (1/4 + 1/4 +1/4) x 4 = 0.75

절대/상대 오차는 10-9 -> 소수점 아래 10자리까지 허용이므로 cout.precision(10)사용

#include <iostream>

#define MAX 29
using namespace std;

int N;
double dir_percent[4];
int dy[] = {0,0,1,-1};
int dx[] = {1,-1,0,0};
bool visit[MAX][MAX];

double dfs(int y, int x, int dis) {
    if (dis >= N) {
        return 1.0;
    }
    double result = 0.0;
    visit[y][x] = true;

    for (int i = 0; i < 4; i++) {
        int ny = y + dy[i];
        int nx = x + dx[i];
        if (visit[ny][nx])continue;
        //현재 확률 + 다음 방향에 대한 확률 
        result+=(dir_percent[i] * dfs(ny, nx, dis + 1));
    }
    visit[y][x] = false;
    return result;
}

int main() {
    cin >> N;
    
    int temp;
    for (int i = 0; i < 4; i++) {
        cin >> temp;
        dir_percent[i] = temp / 100.0;
    }
    
    cout.precision(10);//소수점 10자리 제한
    cout << dfs(14, 14, 0);
    return 0;
}

'알고리즘' 카테고리의 다른 글

BOJ 17142 - 연구소3(C++)  (0) 2021.08.25
Programmers - 광고삽입(C++)  (0) 2021.08.24
Programmers - 외벽점검(C++)  (0) 2021.08.20
BOJ 21608 - 상어초등학교(C++)  (0) 2021.08.19
Programmers - 다단계 칫솔 판매(C++)  (0) 2021.08.17

댓글