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 |