강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của drather1591
drather1591

câu hỏi đã được viết

Giới thiệu về giải bài toán bằng thuật toán Python (chuẩn bị cho bài kiểm tra viết mã)

10. Điều hướng mê cung (DFS)

안녕하세요? 제 코드에서 도저히 이해할 수 없는 결과가 나와서 질문드립니다.

Đã giải quyết

Viết

·

387

1

강의를 정말 잘 보고 있습니다. 날이 무더운데, 더위 조심하시기 바랍니다. 

선생님의 코드와 굉장히 유사하나, 다른점은 저는 check 배열을 통해 방문한 곳, 방문하지 않은 곳을 표시했다는 점입니다. 

이에 따라, for문 안에서, 탐색할 x, y 좌표가 0부터 6까지인지 확인하는 조건문 2개와, board[new_x][new_y]가 0 인지를 확인하는 부분, check[new_x][new_y], 즉 이전에 방문한 노드인지를 확인해서 그 좌표에 대해 DFS를 호출했습니다. 

나머지 부분은 선생님의 코드와 동일합니다. 

그 결과, 원래 정답의 2배를 ANSWER의 값으로 출력했습니다. 제 예상으로는, 이미 갔던 경로를 한번 더 탐색하는것 같은데, 어떤 이유인지는 잘 모르겠습니다. 

비록 남의 코드를 보고 에러를 잡는다는게 쉬운일은 아니지만, 정말 이해가 되지 않아 답답한 마음에 질문 드립니다 ㅠㅠㅠ

import sys

from _collections import deque as dq


def dfs(v):
global answer
print("\n현재 위치: ", v)
if v[0] == 6 and v[1] == 6:
print("찾음, answer:", answer)
answer += 1
return

else:

for j in range(4):
new_row = v[0] + d_row[j]
new_col = v[1] + d_col[j]

if 0 <= new_row < 7 and 0 <= new_col < 7 and check[new_row][new_col] == 0 and board[new_row][new_col] == 0:
print("다음 위치: ", [new_row, new_col])
target = [new_row, new_col]
check[new_row][new_col] = 1
dfs(target)

check[new_row][new_col] = 0


if __name__ == "__main__":

sys.stdin = open("in.txt", "rt")

d_row = [-1, 0, 1, 0]
d_col = [0, 1, 0, -1]

board = []
for _ in range(7):
board.append(list(map(int, input().split())))

check = [[0] * 7 for i in range(7)]
start = [0, 0]
end = [6, 6]

answer = 0

dfs(start)

print(answer)

python코테 준비 같이 해요!

Câu trả lời 2

1

drather님의 프로필 이미지
drather
Người đặt câu hỏi

평생 몰랐을뻔한 오류를 잡아주셔서  정말 감사합니다

1

codingcamp님의 프로필 이미지
codingcamp
Người chia sẻ kiến thức

안녕하세요^^

출발지점을 체크하지 않아 생기는 현상입니다.

check[0][0]=1

dfs(start)

와 같이 출발지점을 체크하고 dfs를 호출하면 됩니다.

Hình ảnh hồ sơ của drather1591
drather1591

câu hỏi đã được viết

Đặt câu hỏi