2013-02-28 3 views
1

나는이 스도쿠 해결사와 놀고 있었는데, 나는 그것을 발견했다.파이썬 : 1 인쇄 추가 내 코드를 죽입니까?

여기에 인용 된 것과 같이 완벽합니다. 단 하나의 print a을 주석 처리하면 (13 행) 주석 처리 한 다음 전체 솔루션을 찾기 전에 중단됩니다 ...?

import sys 
from datetime import datetime # for datetime.now() 

def same_row(i,j): return (i/9 == j/9) 
def same_col(i,j): return (i-j) % 9 == 0 
def same_block(i,j): return (i/27 == j/27 and i%9/3 == j%9/3) 

def r(a): 
    i = a.find('.') 
    if i == -1: # All solved ! 
     print a 
    else: 
     #print a 
     excluded_numbers = set() 
     for j in range(81): 
      if same_row(i,j) or same_col(i,j) or same_block(i,j): 
       excluded_numbers.add(a[j])   
     for m in '123456789': 
      if m not in excluded_numbers: 
       # At this point, m is not excluded by any row, column, or block, so let's place it and recurse 
       r(a[:i]+m+a[i+1:]) 

if __name__ == '__main__': 
    if len(sys.argv) == 2: 
     filI = open(sys.argv[1]) 
     for pusI in filI: 
      pusI.strip() 
      print "pussle:\n",pusI 
      timStart = datetime.now() 
      r(pusI) # <- Calling the recursive solver ... 
      timEnd = datetime.now() 
      print "Duration (h:mm:ss.dddddd): "+str(timEnd-timStart) 
    else: 
     print str(len(sys.argv)) 
     print 'Usage: python sudoku.py puzzle' 

프로그램을 파일과 함께 호출해야합니다. 그 파일은 한 줄에 1 스도쿠를 가지고 있어야합니다.

는 테스트를 위해 나는이 사용 :

25...1........8.6...3...4.1..48.6.9...9.4.8...1..29.4.9.53.7....6..5...7......... 

질문 :

내가 이해할 수없는 어떻게 하나가 완료되기 전에, 재귀 루프를 깰 관리 '는 인쇄'. 아무도 설명을 줄 수 있습니까?

안부 [email protected]

제공 : 원래는 여기에 위의 스도쿠 솔버 코드를 발견 http://www.scottkirkwood.com/2006/07/shortest-sudoku-solver-in-python.html 그것은 또한에 StackOverflow에 여기에 표시된 것 : Shortest Sudoku Solver in Python - How does it work?

+1

오류가 발생하거나 실행하려고하면 자동으로 반환됩니까? – richardhsu

+1

오류가 발생하는 경우이 오류를 표시 할 수 있습니까? –

답변

5

을 실제로 해결책을 찾을 않습니다 . 내가 프로그램을 실행하고 주석을 실행하면 제안 및 출력 파일과 솔루션을

256491738471238569893765421534876192629143875718529643945387216162954387387612954 

를 얻을 :

python solver.py file.txt > output.txt 

을 그리고 솔루션 문자열을 검색, 거기이다. 그것은 마지막 줄이 아니기 때문에 파일에 67 %를 보여줍니다.

이유는 솔버가 기본적으로 많은 조합을 거치며 해결책을 찾지 만 가능한 해결책을 찾기 위해 가능한 모든 경로가있는 한 계속됩니다.

+0

젠장 ... 네가 기쁘다. 이클립스 IDE의 아웃풋 윈도우는 +20.000 라인의 아웃풋을 보존하지 않는다. 그래서 나는 그것을 보지 못했다. 감사! – MartinHvidberg

+0

이 문제를 해결하려면 솔루션을 찾으면 MartinHvidberg가 실행을 중지해야합니다. 일반적으로 여기에서는 수행되지 않는 재귀 함수의 반환 값을 검사하여 수행됩니다. –