2014-12-08 3 views
0

Итак, я решил написать решателя Sudoku, используя метод Backtrack, чтобы решить судоку. Мне показалось, что я заработал, но это не так. Мне кажется, что когда он должен вернуться к предыдущей ROW, он не сможет справиться с этим, он может вернуться только в том же ряду, который мне кажется. Не стесняйтесь задавать больше вопросов, код следующий (жаль, что это не на английском языке):Python sudoku solver останавливается посередине

import sys 

rida = 0 
veerg = 0 
maatriks = [] 

# Loeb failist maatriksi sisse ja teeb temast listide listi. 
def looMaatriks(sisendfail, maatriks): 
    fail = open(sisendfail) 
    for line in fail: 
     line = line.strip() 
     if line != "": 
      rida = line.split(" ") 
      for i in range (0, 9): 
       if rida[i] != "-": 
        rida[i] = int(rida[i]) 
       else: 
        rida[i] = 0 
      print(line.split(" ")) 
      maatriks.append(rida) 
    return maatriks 

maatriks = looMaatriks('sisend1.txt', maatriks) 
#print(maatriks) 

# Kontrollib, kas antud ruudukeses on number juba või mitte. 
def numberOlemas(maatriks, rida, veerg): 
    print(rida) 
    print(veerg) 
    if maatriks[rida][veerg] != 0: 
     return True 
    else: 
     return False 

print(numberOlemas(maatriks, 1,0)) 

# Kontrollib, kas arv sobib antud ruutu. 
def kasSobib(maatriks, rida, veerg, arv): 
    for i in range (0, 9): 
     if arv == maatriks[rida][i]: 
      return False 
    for i in range (0, 9): 
     if arv == maatriks[i][veerg]: 
      return False 
    return True 

def prindiMaatriks(maatriks): 
    for i in range (0, 9): 
     print(maatriks[i]) 
    print("") 

def lahendaRuut(maatriks, rida, veerg): 
    prindiMaatriks(maatriks) 

    if numberOlemas(maatriks, rida, veerg) == True: 
     print("juba olemas") 
     if veerg > 7: 
      print("yolo2"); 
      rida = rida + 1 
      if rida > 8: 
       print("DONE!") 
       sys.exit() 
      veerg = -1   
     lahendaRuut(maatriks, rida, veerg + 1) 
    else: 
     for i in range (1, 10): 
      if kasSobib(maatriks, rida, veerg, i): 
       maatriks[rida][veerg] = i 
       if veerg > 7: 
        print("yolo"); 
        rida = rida + 1 
        if rida > 8: 
         print("DONE!") 
         sys.exit() 
        veerg = -1 
       lahendaRuut(maatriks, rida, veerg + 1) 
      print("ei sobi") 

    prindiMaatriks(maatriks) 
lahendaRuut(maatriks, rida, veerg) 

ответ

0

Проблема заключается в том, что вы никогда не удалить неправильные цифры. Судоку постепенно заполняется неправильными цифрами в случайных местах.

def lahendaRuut(maatriks, rida, veerg): 
    prindiMaatriks(maatriks) 

    if numberOlemas(maatriks, rida, veerg) == True: 
     print("juba olemas") 
     if veerg > 7: 
      print("yolo2"); 
      rida = rida + 1 
      if rida > 8: 
       print("DONE!") 
       sys.exit() 
      veerg = -1   
     lahendaRuut(maatriks, rida, veerg + 1) 
    else: 
     for i in range (1, 10): 
      if kasSobib(maatriks, rida, veerg, i): 
       maatriks[rida][veerg] = i 
       if veerg > 7: 
        print("yolo"); 
        rida = rida + 1 
        if rida > 8: 
         print("DONE!") 
         sys.exit() 
        veerg = -1 
       lahendaRuut(maatriks, rida, veerg + 1) 
      print("ei sobi") 

     #========================= 
     # very important line of code 
     # resets the cell before the algorithm backtracks 
     maatriks[rida][veerg] = 0 
     #========================= 


    prindiMaatriks(maatriks) 
+0

Спасибо! Я тоже добрался до него, но все же он иногда меняет числа, которые заданы, и это бесполезно, и поэтому оно не решит его. –