解决数独谜题的难度

时间:2014-12-23 19:03:05

标签: python-2.7

我用python解决了数独难题。我正在使用回溯错误的方法解决它。我的代码正确地将这个方法实现到一定数量的元素。但是在一些元素之后它没有移动到下一个空单元格实现这一点,但它是在那个特定的单元格。我认为我检查某个位置的值是否有效的函数是否正常工作。我无法弄清楚我正在做的错误。有人可以帮我解决这个问题。

代码:

from numpy import *
def isValid(matrix,row,col):
    element = matrix[row][col]
    #print element
    #print where(matrix[row,:] == element)
    if len(where(matrix[row,:] == element)[0]) == 1  and len(where(matrix[:,col] == element)[0]) == 1:
        #print 'entered'
        row_type = row%3;col_type =col%3
        row_index = row-row_type;col_index = col-col_type  
        if len(where(matrix[row_index:row_index+3,col_index:col_index+3])[0] == 1):
            return 1
        else:
            return 0
    else :
        return 0


sudoku = loadtxt('1')
sudoku = array(sudoku,dtype = int)

blankRow,blankCol = where(sudoku == 0)
i=0
while i< len(blankRow):
    print 'i:',i
    #print 'entered'
    while sudoku[blankRow[i],blankCol[i]] < 9:
        #print 'entered',sudoku[blankRow[i],blankCol[i]]
        sudoku[blankRow[i],blankCol[i]] += 1 
        #j = sudoku[blankRow[i],blankCol[i]]
        valid = isValid(sudoku,blankRow[i],blankCol[i])
        if valid == 1:
            break           
    if  sudoku[blankRow[i],blankCol[i]] == 9 and valid != 1:
        print 'entered' #invalid,i:',i,'j',j,'row:',blankRow[i],'col:',blankCol[i]
        sudoku[blankRow[i],blankCol[i]] = 0
        i-= 1 
    i+=1

1 个答案:

答案 0 :(得分:0)

您的回溯永远不会奏效,因为您无条件地在外部循环的末尾将{1}添加到i。我想您希望将该增量放在else块中,并附加到其上方的if

if  sudoku[blankRow[i],blankCol[i]] == 9 and valid != 1:
    print 'entered' #invalid,i:',i,'j',j,'row:',blankRow[i],'col:',blankCol[i]
    sudoku[blankRow[i],blankCol[i]] = 0
    i-= 1 
else:         # add this!
    i+=1      # indent this!

请注意,如果给出了无法解决的难题,您可能需要添加一些额外的检查以使代码正常运行。在这种情况下,i将变为负数,因为它会超越第一个位置。这实际上不会导致立即错误,因为您可以使用负值索引列表或数组,但在尝试(并且失败)多次再次解决难题后,它最终会引发异常。