728x90
시간제한 1초, 메모리 제한 128MB
# 조건
한수는 캠프를 마치고 집에 돌아가려 한다.
한수는 현재 왼쪽 아래점에 있고 집은 오른쪽 위에 있다.
그리고 한수는 집에 돌아가는 방법이 다양하다.
- 단, 한수는 똑똑하여 한번 지나친 곳을 다시 방문하지는 않는다.
cdef ...f ..ef ..gh cdeh cdej ...f
bT.. .T.e .Td. .Tfe bTfg bTfi .Tde
a... abcd abc. abcd a... a.gh abc.
거리 : 6 6 6 8 8 10 6위 예제는 한수가 집에 돌아갈 수 있는 모든 경우를 나타낸 것이다.
T로 표시된 부분은 가지 못하는 부분이다.
문제는 R x C 맵에 못가는 부분이 주어지고 거리 K가 주어지면 한수가 집까지도 도착하는 경우 중 거리가 K인 가짓수를 구하는 것이다.
입력
- 첫 줄에 정수 R(1 ≤ R ≤ 5), C(1 ≤ C ≤ 5), K(1 ≤ K ≤ R×C)가 공백으로 구분되어 주어진다.
- 두 번째부터 R+1번째 줄까지는 R×C 맵의 정보를 나타내는 '.'과 'T'로 구성된 길이가 C인 문자열이 주어진다.
출력
- 첫 줄에 거리가 K인 가짓수를 출력한다.
# 접근 방법
- dfs를 사용하여 풀어줄 수 있다.
- 또한, 백트래킹을 사용하여 해를 도출한 이후 다시 원상태로 복구 해주며 다른 길을 찾아준다.
- 카운트가 k == K인 경우 집인지 체크해주면 된다.
import sys
input=sys.stdin.readline
dx=[-1,1,0,0]
dy=[0,0,-1,1]
N,M,K=map(int,input().split())
graph=[ list(input().rstrip()) for i in range(N) ]
answer=0
def DFS(x,y,count):
global answer
if count==K and x==0 and y==M-1:
answer+=1
else:
for i in range(4):
nx=x+dx[i] ; ny=y+dy[i]
if 0<=nx<N and 0<=ny<M and graph[nx][ny]=='.':
graph[nx][ny]='T'
DFS(nx,ny,count+1)
graph[nx][ny]='.' #이미왔던 지점은 막아주는대신에 , 끝까지 탐색한후에는 원래되로 되돌려놓는다.
graph[N-1][0]='T'
DFS(N-1,0,1)
print(answer)
728x90
'ALGORITHM > 백트래킹' 카테고리의 다른 글
[프로그래머스 Lv3] 파이썬 - 사라지는 발판 (0) | 2023.08.02 |
---|---|
[백준 2661번] 파이썬 - 좋은 수열 (0) | 2023.08.02 |
[백준 1799번] 파이썬 - 비숍 (0) | 2023.04.30 |
[백준 14888번] 파이썬 - 연산자 끼워넣기 (0) | 2023.04.07 |
[백준 2239번] 파이썬 - 스도쿠 (0) | 2023.01.29 |