Beispiel #1
0
def solve(unsolved_sudoku):
    # https://github.com/hbldh/dlxsudoku
    from dlxsudoku import Sudoku
    from dlxsudoku.exceptions import SudokuHasMultipleSolutionsError, SudokuHasNoSolutionError, SudokuTooDifficultError

    s = table_to_string(unsolved_sudoku)
    try:
        sudoku = Sudoku(s)
        sudoku.solve()
    except SudokuHasNoSolutionError as e:
        print(e)
        return unsolved_sudoku
        pass
    except SudokuHasMultipleSolutionsError as e:
        print(e)
        return unsolved_sudoku
        pass
    except SudokuTooDifficultError as e:
        print(e)
        return unsolved_sudoku
    else:
        return string_to_table(sudoku.to_oneliner())
Beispiel #2
0
from dlxsudoku import Sudoku

f = open('sudoku.txt', 'r')

ret = 0
for l in f:
    s = Sudoku(l)
    s.solve()
    s = s.to_oneliner()
    ret += int(s[0:3])
print ret
def AttemptSudokuSolve(InputQueue, ProcessedDigits, FinalImage):

    loaded_model = joblib.load('finalized_sudoku_model.sav')
    from dlxsudoku import Sudoku
    font = cv2.FONT_HERSHEY_SIMPLEX
    result_old = np.zeros(81)
    result_really_old = result_old
    result = np.zeros(81)
    while True:

        gray = InputQueue.get()
        img, cropped, digits = cw.extract_sudoku(gray)
        boardFound = 1
        result_really_really_old = result_really_old
        result_really_old = result_old
        result_old = result
        sleep(0.05)

        ProcessedDigits.put(img)

        result = loaded_model.predict(digits)
        resultList = (result_old, result_really_old, result_really_really_old)
        for resul in resultList:
            for i in result:
                if result[i] == 10:
                    if resul[i] != 10:
                        #print('correction2')
                        print(
                            str(result[i]) + " changed to " +
                            str(int(resul[i])))
                        result[i] = int(resul[i])
        temp = 0
        for i in result:
            if i == 10:
                temp = temp + 1
                result[i] = 0
        if temp >= 6:
            continue

        res = ""
        grid = np.zeros((9, 9), dtype='int')
        grid = result.reshape(9, 9)
        #Getting the set of numbers within a number's group------------------------------------

        for re in result:
            if re == 10:
                boardFound = 0
                break
            else:
                res += str(re)
        if boardFound == 1:
            #print(res)

            try:
                #start = time.time()
                s1 = Sudoku(res)
                s1.solve(verbose=False, allow_brute_force=True)
                #print("YAY!")
                stringlist = s1.to_oneliner()
                charlist = list(stringlist)
                results = list(map(int, charlist))
                #print(results)

                y = cropped.shape[0]
                cell_Spacing = y // 9
                posx = cell_Spacing // 2 - 4
                posy = cell_Spacing // 2 + 6

                for i in range(81):
                    if results[i] != result[i]:
                        cropped = cv2.putText(cropped, charlist[i],
                                              (posx, posy), font, 0.6,
                                              (0, 0, 255), 2, cv2.LINE_AA)
                    if posx + cell_Spacing >= y:
                        posy = posy + cell_Spacing
                        posx = cell_Spacing // 2 - 4
                    else:
                        posx = posx + cell_Spacing
                FinalImage.put(cropped)

            except:
                pass
                #print("too many solutions")
        else:
            pass