2016-12-14 98 views
-2

我看到了一些数独求解器的实现,但我无法弄清楚我的代码中的问题。我有一个功能sudokusolver成为sudoku董事会,必须返回解决sudoku板。用python跟回溯的数独求解器

def sudokutest(s,i,j,z): 
    # z is the number 
    isiValid = np.logical_or((i+1<1),(i+1>9)); 
    isjValid = np.logical_or((j+1<1),(j+1>9)); 
    iszValid = np.logical_or((z<1),(z>9)); 
    if s.shape!=(9,9): 
     raise(Exception("Sudokumatrix not valid")); 
    if isiValid: 
     raise(Exception("i not valid")); 
    if isjValid: 
     raise(Exception("j not valid")); 
    if iszValid: 
     raise(Exception("z not valid")); 

    if(s[i,j]!=0): 
     return False; 

    for ii in range(0,9): 
     if(s[ii,j]==z): 
      return False; 

    for jj in range(0,9): 
     if(s[i,jj]==z): 
      return False; 

    row = int(i/3) * 3; 
    col = int(j/3) * 3; 
    for ii in range(0,3): 
     for jj in range(0,3): 
      if(s[ii+row,jj+col]==z): 
       return False; 

    return True; 

def possibleNums(s , i ,j): 
    l = []; 
    ind = 0; 
    for k in range(1,10): 
     if sudokutest(s,i,j,k): 
      l.insert(ind,k); 
      ind+=1; 
    return l; 

def sudokusolver(S): 
    zeroFound = 0; 
    for i in range(0,9): 
     for j in range(0,9): 
      if(S[i,j]==0): 
       zeroFound=1; 
       break; 
     if(zeroFound==1): 
      break; 
    if(zeroFound==0): 
      return S; 

    x = possibleNums(S,i,j); 
    for k in range(len(x)): 
     S[i,j]=x[k]; 
     sudokusolver(S); 
    S[i,j] = 0; 

    return S; 

sudokutest和possibleNums是正确的,只是sudokusolver给予RecursionError

+0

为什么在sudokusolver中使用S [i,j] = 0;?以及你如何用Numpy构建矩阵S [i,j]或? –

+0

是的,有numpy,我用s [i,j] = 0来回溯,当num不是正确的时候 –

+0

好的...然后检查我要安装numpy :-)让我们来看看。要启动你的软件,那么我只需要s = numpy.zeros(shape =(9,9)) sudokusolver(s),对吗? –

回答

0

最后我得到了NumPy的启动和运行,我不得不用手(我的问题)来复制的数量。总之在一个非常简单的解决方案下。在你的代码中(我修改了一下以了解矩阵),你必须找到一个合适的方法来阻止数独完全解决的时刻。要做到这一点,我已经使用了很多像sys.exit()这样的东西,但是你可以在矩阵完成后实现额外的检查并移出整个循环。否则,你会用新的零写在已完成的零之上,并且你将一次又一次地运行相同的步骤。

我已经做只有一个小的调试,但可以引入更多的打印出来,并检查如何矩阵本身是不断发展的:-)

至少现在是工作,希望你会投票给我的“短期”解。 祝您有个美好的一天,玩得开心!

def sudokutest(s,i,j,z): 
    # z is the number 
    isiValid = numpy.logical_or((i+1<1),(i+1>9)); 
    isjValid = numpy.logical_or((j+1<1),(j+1>9)); 
    iszValid = numpy.logical_or((z<1),(z>9)); 
    if s.shape!=(9,9): 
     raise(Exception("Sudokumatrix not valid")); 
    if isiValid: 
     raise(Exception("i not valid")); 
    if isjValid: 
     raise(Exception("j not valid")); 
    if iszValid: 
     raise(Exception("z not valid")); 

    if(s[i,j]!=0): 
     return False; 

    for ii in range(0,9): 
     if(s[ii,j]==z): 
      return False; 

    for jj in range(0,9): 
     if(s[i,jj]==z): 
      return False; 

    row = int(i/3) * 3; 
    col = int(j/3) * 3; 
    for ii in range(0,3): 
     for jj in range(0,3): 
      if(s[ii+row,jj+col]==z): 
       return False; 

    return True; 

def possibleNums(s , i ,j): 
    l = []; 
    ind = 0; 
    for k in range(1,10): 
     if sudokutest(s,i,j,k): 
      l.insert(ind,k); 
      ind+=1; 
    return l; 

def sudokusolver(S): 
    zeroFound = 0; 
    for i in range(0,9): 
     for j in range(0,9): 
      if(S[i,j]==0): 
       zeroFound=1; 
       break; 
     if(zeroFound==1): 
      break; 
    if(zeroFound==0): 
     print("REALLY The end") 
     z = numpy.zeros(shape=(9,9)) 
     for x in range(0,9): 
      for y in range(0,9): 
       z[x,y] = S[x,y] 
     print(z) 
     return z 


    x = possibleNums(S,i,j); 

    for k in range(len(x)): 
     S[i,j]=x[k]; 
     sudokusolver(S); 
    S[i,j] = 0; 


if __name__ == "__main__": 
    import numpy 
    #s = numpy.zeros(shape=(9,9)) 

    k = numpy.matrix([0,0,0,0,0,9,0,7,8,5,1,0,0,0,0,0,6,9,9,0,8,0,2,5,0,0,0,0,3,2,0,0,0,0,0,0,0,0,9,3,0,0,0,1,0,0,0,0,4,0,0,0,8,0,8,0,0,0,9,0,7,0,0,6,0,1,0,0,0,0,0,0,0,0,0,0,7,0,8,0,1]).reshape(9,9) 
    print(k) 
    print('*'*80) 
    sudokusolver(k) 
+0

如果在同一行上使用相同的初始数字(我没有检查过那些不可能的情况),但是在一个程序中总会有一些东西需要改进!! Ciao ciao –

+0

为什么你用count和。在此之前,我们有S [i,j] = 0;所以下一个循环,我认为是没用的 –

+0

计数是一个剩余的:-)对不起......你可以完全删除。 –