如何让我的数独解算器从 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
通过这一行更改,您的代码解决了数独问题,即使在我为缺失的行填充了 0 之后也是如此。
board = []
with open('project.txt','r') as file:
for line in file:
board.append(list(map(int,line.strip())))
我在解决之前加了一个print_board
。这就是你看到它两次的原因。
输出:
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
我会做这样的事情。
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 = []
函数内部。
我无法弄清楚如何为我的数独解算器读取文本文件。所以我可以让它从文本文件中读取棋盘,当它在代码中时我可以得到我的代码来解决棋盘,但我不能打赌他们一起阅读和解决。这就是我所拥有的,我已经尝试了一些方法来让它可能工作,但我不理解它。如果有人可以提供帮助,我将不胜感激!谢谢!
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
通过这一行更改,您的代码解决了数独问题,即使在我为缺失的行填充了 0 之后也是如此。
board = []
with open('project.txt','r') as file:
for line in file:
board.append(list(map(int,line.strip())))
我在解决之前加了一个print_board
。这就是你看到它两次的原因。
输出:
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
我会做这样的事情。
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 = []
函数内部。