파이썬 알고리즘 064 | 미로탐색(DFS)

Yunny.Log ·2021년 1월 20일
0

Algorithm

목록 보기
64/318
post-thumbnail

64. 미로탐색(DFS)

7x7 격자판 미로를 탈출하는 경로의 가지수를 출력하는 프로그램을 작성하세요. 출발점은 격자의 (1, 1) 좌표이고, 탈출 도착점은 (7, 7)좌표이다. 격자판의 1은 벽이고, 0은 통로이다. 격자판의 움직임은 상하좌우로만 움직인다. 미로가 다음과 같다면

위의 지도에서 출발점에서 도착점까지 갈 수 있는 방법의 수는 8가지이다.
▣ 입력설명
7*7 격자판의 정보가 주어집니다.
▣ 출력설명
첫 번째 줄에 경로의 가지수를 출력한다.
▣ 입력예제 1
0 0 0 0 0 0 0
0 1 1 1 1 1 0
0 0 0 1 0 0 0
1 1 0 1 0 1 1
1 1 0 0 0 0 1
1 1 0 1 1 0 0
1 0 0 0 0 0 0
▣ 출력예제 1
8

<내 풀이>


def dfs(k,x,y) :
    global cnt
    if x==6 and y==6:
        cnt+=1
        return
    else : 
        for i in range(4) :
            if 0<=x+dx[i]<=6 and 0<=y+dy[i]<=6 and a[x+dx[i]][y+dy[i]]==0:
                a[x+dx[i]][y+dy[i]]=1
                dfs(k+1, x+dx[i], y+dy[i])
                a[x+dx[i]][y+dy[i]]=0
if __name__=='__main__' :
    a=[list(map(int, input().split())) for _ in range(7)]
    a[0][0]=1
    dx=[-1,0,1,0]
    dy=[0,1,0,-1]
    cnt=0
    dfs(0,0,0)
    print(cnt)
    

<풀이>

  • 체크 표시가 안돼있는 데만 가기 가능,
    돼있는 데를 가면 다시 되돌아가는 것..

dx=[-1,0,1,0]
dy=[0,1,0,-1]
def dfs(x,y) :
    global cnt
    if x==6 and y==6:
        cnt+=1
    else : 
        for i in range(4):
            xx=x+dx[i]
            yy=y+dy[i]
            if 0<=xx<=6 and 0<=yy<=6 and a[xx][yy]==0:
                a[xx][yy]=1
                dfs(xx,yy)
                a[xx][yy]=0

if __name__=='__main__' :
    a=[list(map(int,input().split())) for _ in range(7)]
    cnt=0
    a[0][0]=1
    dfs(0,0)
    print(cnt)

<반성점>

  • 처음에 문제가 전 문제 (최단거리) 랑 똑같은 줄 알고 그렇게 풀다가 아니란 것을 왜 답이 안나올까..보다가 뒤늦게 깨달음 무조건 문제를 잘 파악하자 우선

<배운 점>

  • 나는 원래 dfs에서 다음으로 넘어가는 x+1이 꼭 필요하다고 생각해서 꼬박꼬박
    넣었었는데 위의 풀이 코드와 같이 굳이 x+1이 필요없는 경우는 안 넣어도 되나 보다.. 잘 구분해서 사용하자 앞으로도 계속

0개의 댓글