def answer_solve_sudoku(__grid):
res = check_sudoku(__grid)
if res is None or res is False:
return res
grid = copy.deepcopy(__grid)
# find the first 0 element and change it to each of 1..9,
# recursively calling this function on the result
for row in xrange(9):
for col in xrange(9):
if grid[row][col] == 0:
for n in xrange(1, 10):
grid[row][col] = n
new = answer_solve_sudoku(grid)
if new is not False:
return new
# backtrack
return False
# if we get here, we found no zeros and so we're finished
return grid
여기 코드가 있으며 check_sudoku(grid)
은 유효한 스도쿠인지 아닌지를 반환 할 수 있습니다.파이썬에서 스도쿠의 반복 솔루션
난 그냥 재귀 부분을 이해할 수 없다, 나는 종이에 프로세스를 적어 봤지만 매번 실패했다, 어떻게 backtraking 작동합니까? new
은 무엇입니까? answer_solve_sudoku(grid)
이 유효하면?
매번 0에서 1..9까지를 설정하고 그것이 유효한 그리드인지 아닌지를 확인하지만, 전체 프로세스를 종이에 그릴 수는 없습니다. 그리고 백 트랙이 어떻게 작동하는지 이해할 수 없습니다.
btw, 재귀 코드 이해에 대한 조언이 있습니까?
최고 감사합니다,
쉥 윤
편집
나는 또 다시 코드를 읽고, 지금은 어떤 이해를 가지고 있지만, 이것에 대해 확인 그냥 해요, 누군가가 나에게 약간의 의견을 주면 그것은 친절 할 것이다.
# backtrack
return False
가 호출 될 때
, 상기 솔버는 솔루션을 발견 할 때1, return new
에만 호출 될 것이다 , 이는 오른쪽 return grid
2 후에 호출 될 것인가? 다음 해결 방법이 올바르지 않으면 check_sudoku(__grid)
은 False
을 반환하고 다음 해결 방법이 맞으면 올바른 해결책을 얻을 때까지 answer_solve_sudoku(grid)
을 다시 호출하고 올바른 해결 방법을 얻으면 return grid
, return new
이됩니다. 따라서 언제입니까 :
# backtrack
return False
더 작은 문제로 어떻게 되돌아 오는 트랙을 볼 수 있는지 쉽게 알 수 있습니다. 4 명의 여왕처럼 ... http://www.academic.marist.edu/~jzbv/algorithms/Backtracking.htm을 확인하십시오. –
이상한 우연 ... 이 질문에 2 일 전 대답했다. http://stackoverflow.com/q/11486358/496445, 같은 주제, 동일한 함수 이름. – jdi
@jdi 아마 때문일 수 있습니다. http://www.udacity.com/view#Course/cs258/CourseRev/1/Unit/139002/Nugget/273001 – shengy