Home (Python)[백준] 미친 로봇_1405
Post
Cancel

(Python)[백준] 미친 로봇_1405

문제


1405번: 미친 로봇

풀이


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
# 이동 경로 -> 좌표 -> 이차원 리스트, 방향 정의 필요
# 이동 경로가 단순하다는 것은 한 번 간 곳을 다시 가지 않는다는 것 
# 단순할 확률 = 한 번 간 곳을 다시 가지 않을 확률 -> 방문 처리 하며 DFS 탐색

from typing import List
import sys

# sys.setrecursionlimit(10**6) 
# 왜 여기서는 안해줘도 에러가 안나지? 저번 문제하고 무슨 차이?
# 저번 문제는 재귀 기본 제한을 늘려준 것. 이번 문제는 늘릴 필요가 없는 것

input=sys.stdin.readline

N,e,w,s,n = map(int, input().split())

# 가로 x축, 세로 y축 일 때
# 동,서,남,북 방향 정의 
dx = [1,-1,0,0]
dy = [0,0,1,-1]

# 동,서,남,북 이동할 확률
pred_list = [e,w,s,n]

# 현재 위치에서 최대 N만큼 이동해야 하므로 
# N이 중앙으로 오도록 2차원 배열 생성
graph = [[0]*(2*N+1) for _ in range(2*N+1)]

answer = 0

def dfs(x: int, y: int, pred: float, cnt: int):
    global answer

    if cnt == N:
        # cnt가 N인 모든 경우에 대한 OR 연산이므로 +
        answer += pred
        return

    # 현재 노드 방문 처리
    graph[x][y] = 1
    # 현재 노드의 방문 확률
    now_pred = pred
    
    for i in range(len(pred_list)):
        next_x = x + dx[i]
        next_y = y + dy[i]

        if 0 <= next_x < (2*N+1) and 0 <= next_y < (2*N+1):
            if not graph[next_x][next_y]:
                # 현재 위치에서 연달아 동서남북 이동할 경우에 대한 AND 연산이므로 *
                dfs(next_x, next_y, now_pred * (pred_list[i]/100), cnt+1)

                # 이후 실행될 dfs 함수 처리를 위해 방문 처리 해제
                graph[next_x][next_y] = 0

            else: 
                continue

dfs(N, N, 1, 0)

print(answer)
This post is licensed under CC BY 4.0 by the author.