Sudoku - błąd

0

Witam wszystkich,
W moim kodzie mam gdzieś błąd, wydaje mi się że w ostatniej funkcji, chyba brakuje mi jakiegoś ifa? Proszę o pomoc - wskazanie miejsca błędu.
Miałem w pliku zapisać sudoku a w miejscach pustych wstawiać 0, potem wczytać plik, wskazać indeksy miejsc z zerami, dla każdego indeksu przyporządkować możliwe rozwiązania i rozwiazać sudoku. W 1 wierszu Wstawia u mnie cyfry po kolei, na 9 miejscu zostaje mi jedynie 9 do wyboru, ale tam nie może być, więc program zostawia 0 i kończy pracę. Wklejam kod oraz przykładowy plik.txt z sudoku.
Proszę o pomoc, pozdrawiam

with open ('sudoku.txt','r') as sudoku:
    a=[] 
    for x in range(0,9):
        b = []
        for i in sudoku.readline().strip():
            i = int(i)
            b.append(i)
        a.append(b)
        if len(b) != 9:
            print 'NIEPOPRAWNE DANE'
            break

def anyunknowns(tablica):
    for wiersz in tablica:
        for x in wiersz:
            if x == 0:
                return True
    return False

def findunknown(tablica):
    for i in range(0,9):
        for j in range(0,9):
            if tablica[i][j] == 0:
                return i,j


def findoknumbers(grid,i,j):
    list1 = []
    for n in range(1,10):
        isok = True
        for x in range(9):
            if grid[i][x] == n:
                isok = False
        for x in range(9):
            if grid[x][j] == n:
                isok = False
        for p in range(3*(i//3),3*(i//3)+3):
            for q in range(3*(j//3),3*(j//3)+3):
                if grid[p][q] == n:
                    isok = False
        if isok == True:
            list1.append(n)
    return list1



def solve_sudoku(a):
    for wiersz in a:
        print wiersz
    print "---"
    if anyunknowns(a):
        i,j=findunknown(a)
        numbers=findoknumbers(a,i,j)
        if numbers == []:
            return False
        else:
            print i,j,numbers
        for n in numbers:
           anew = a
           anew[i][j] = n
           solution = solve_sudoku(anew)
           if (solution == False) and (n == numbers[-1]):
               return False
           else:
               return solution
    else:
        return a
print solve_sudoku(a)

Na wszelki wypadek treść mojego pliku sudoku.txt
005000800
040209060
600070009
090605010
002000400
060704050
800060001
070408020
009000600

0

Błąd, jak sądzę, polega na tym, że w solve_sudoku() błędnie obsługujesz sytuację, gdy solution == False i jednocześnie nie n == numbers[-1], jest wtedy zwracana wartość solution==False, a powinny być sprawdzane kolejne możliwości z numbers.

0

było:

     if (solution == False) and (n == numbers[-1]):
               return False
           else:
               return solution

hmm:

if solution:
               return True
           anew[i][j]=0
        return False
        

Teraz przynajmniej ciągnie mi i dalej sprawdza, aczkolwiek nie kończy swojej działaności, tylko ciągle zmienia liczby w nieskończoność

0

Więc dodaj do poprzedniej wersji ifa wariant, który będzie ją odpowiednio obsługiwał...

1 użytkowników online, w tym zalogowanych: 0, gości: 1