def check(cnt,total,di): global result if cnt == arr[0]: temp = 1 for k in di: temp *= arr[dire.index(k)+1]/100 result += temp return else: cu_x,cu_y = total[-1] for i in range(4): nx = cu_x + dx[i] ny = cu_y + dy[i] if (nx,ny) not in total: check(cnt+1,total+[(nx,ny)],di+[dire[i]]) # 동 서 남 북 dx = [0,0,1,-1] dy = [1,-1,0,0] dire = ['E','W','S','N'] arr = list(map(int,input().split())) result = 0 check(0,[(0,0)],[]) print(ccnt)
기본적인 재귀함수를 통해 탐색을 통해 구할 수 있다. 중복이 있으면 재귀를 실행안해주고, 끝까지 갈때까지 해주는 것이다.
이 방법은 되는 것을 구하는 방식인데, 끝까지 가야하므로, 실행시간이 오래걸린다.
def dfs(x,y,persent,cnt): global revers_persen,N,total if arr[x][y] == 1: revers_persen += persent return if cnt == N: return arr[x][y] = 1 for i in range(4): nx = x + dx[i] ny = y + dy[i] if persentlist[i]: dfs(nx,ny,persent*persentlist[i],cnt+1) arr[x][y] = 0 N,e,w,s,n = map(int,input().split()) e,w,s,n = e/100,w/100,s/100,n/100 dx = [0,0,1,-1] dy = [1,-1,0,0] persentlist = [e,w,s,n] arr = [[0]*29 for _ in range(29)] revers_persen = 0 dfs(14,14,1,0) print(f'{1-revers_persen:.10f}')
이 방법은 역으로 되지 않는 경우의 확률을 구해서, 1에서 빼주는 것이다. 이때는, format을 통해 소숫점 자리수까지 나오게 해줘야한다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ] 1002 터렛 (0) | 2021.01.13 |
---|---|
[BOJ] 5014 스타트링크 (0) | 2021.01.13 |
[BOJ] 1486 등산 (0) | 2021.01.13 |
[BOJ] 1916 최소 비용 구하기 (0) | 2021.01.13 |
[BOJ] 17471 게리멘더링 (0) | 2021.01.12 |