簡體   English   中英

如何讓我的數獨求解器從 python 中的文本文件中讀取?

[英]How to get my sudoku solver to read from text file in python?

我無法弄清楚如何為我的數獨求解器讀取文本文件。 所以我可以讓它從一個文本文件中讀取板子,當它在代碼中時,我可以讓我的代碼來解決板子,但我不能打賭他們一起閱讀和解決。 這就是我所擁有的,我已經嘗試了一些方法來讓它可能工作,但我不理解它。 如果有人可以提供幫助,我將不勝感激! 謝謝!

board = []
with open('project.txt','r') as file:
    for line in file:
         board.append(line.strip('\n').split(','))
         if line != '':
             (board)

#backtracking
def solve(pr):
    find = find_empty(pr)
    if not find:
        return True
    else:
        row, col = find

    for r in range(1,10):
        if valid(pr, r, (row, col)):
            pr[row][col] = r

            if solve(pr):
                return True

            pr[row][col] = 0

    return False


def valid(pr, num, pos):
    # Check row
    for r in range(len(pr[0])):
        if pr[pos[0]][r] == num and pos[1] != r:
            return False

    # Check column
    for r in range(len(pr)):
        if pr[r][pos[1]] == num and pos[0] != r:
            return False

    # Check box
    box_x = pos[1] // 3
    box_y = pos[0] // 3

    for r in range(box_y*3, box_y*3 + 3):
        for c in range(box_x * 3, box_x*3 + 3):
            if pr[r][c] == num and (r,c) != pos:
                return False

    return True

#formatting
def print_board(pr):
    for r in range(len(pr)):
        if r % 3 == 0 and r != 0:
            print("- - - - - - - - - - - - - ")

        for c in range(len(pr[0])):
            if c % 3 == 0 and c != 0:
                print(" | ", end="")

            if c == 8:
                print(pr[r][c])
            else:
                print(str(pr[r][c]) + " ", end="")


def find_empty(pr):
    for r in range(len(pr)):
        for c in range(len(pr[0])):
            if pr[r][c] == 0:
                return (r, c)  # row, col

    return None

solve(board)
print_board(board)

我的 txt 文件如下所示:

003020600
900305001
001806400
008102900
700000008
006708200
002609500
800203009
005010300

我會做這樣的事情。

def loadBoard(fname):
    board = []
    with open(fname, 'r') as f:
        for line in f:
            board.append([int(x) for x in line.strip('\n')])
    return board

這是基於您所說的輸入在您對 Mike_S 答案的評論中,換句話說,只是沒有分隔符的數字行(當然,除非您包括換行符)。 在我看來,您將輸入用作整數,因此您希望像我在此示例中所做的那樣將它們轉換為整數。 然后要獲得董事會,您只需執行以下操作:

board = loadBoard('project.txt')

我希望這有幫助。 如果我誤解了什么,你讓我知道,我會盡力回來糾正它。

編輯因為我忘了放

board = []

function 內部。

您的輸入文件應該看起來如何? 像這樣嗎?:

1 x 3 x 5
23 x 5 65
12 23 x 54
...

如果是這樣,您應該逐行閱讀並將其拆分。 我只需要知道您的輸入文件應該是什么樣子。

通過這一行更改,您的代碼可以解決數獨問題,即使在我為缺失的行填寫 0 之后也是如此。

board = []
with open('project.txt','r') as file:
    for line in file:
         board.append(list(map(int,line.strip())))

Output:

9 0 0  | 3 0 5  | 0 0 1
0 0 1  | 8 0 6  | 4 0 0
0 0 8  | 1 0 2  | 9 0 0
- - - - - - - - - - - - - 
7 0 0  | 0 0 0  | 0 0 8
0 0 6  | 7 0 8  | 2 0 0
0 0 2  | 6 0 9  | 5 0 0
- - - - - - - - - - - - - 
8 0 0  | 2 0 3  | 0 0 9
0 0 5  | 0 1 0  | 3 0 0
0 0 0  | 0 0 0  | 0 0 0

9 2 4  | 3 7 5  | 8 6 1
5 3 1  | 8 9 6  | 4 7 2
6 7 8  | 1 4 2  | 9 3 5
- - - - - - - - - - - - - 
7 5 3  | 4 2 1  | 6 9 8
1 9 6  | 7 5 8  | 2 4 3
4 8 2  | 6 3 9  | 5 1 7
- - - - - - - - - - - - - 
8 4 7  | 2 6 3  | 1 5 9
2 6 5  | 9 1 7  | 3 8 4
3 1 9  | 5 8 4  | 7 2 6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM