我从秋天开始就用python开始编码。所以我不是一个专业的python编码器。 我已经开始编写一个Sudoku程序。幸运的是,最后我可以提出这个代码:
def isValid(num, x, y):
for i in range(9):
if board[i][y] == num:
return False
if board[x][i] == num:
return False
row = x - x % 3
col = y - y % 3
for i in range(3):
for j in range(3):
if board[i + row][j + col] == num:
return False
return True
def solve(remaining):
if remaining == 0:
return True
for i in range(9):
for j in range(9):
if board[i][j] != 0:
continue
for num in range(1, 10):
if isValid(num, i, j):
board[i][j] = num
if solve(remaining - 1):
return True
board[i][j] = 0
return False
return False
def pp():
for i in range(9):
for j in range(9):
print(board[i][j], end=" ")
print()
print()
board = []
remaining = 0
for i in range(9):
a=input()
a=a.split()
a = list(map(int, a))
for j in a:
if j == 0:
remaining += 1
board.append(a)
solve(remaining)
pp()
例如,我给它一个输入:
0 0 0 0 0 0 0 1 0
0 0 2 0 0 0 0 3 4
0 0 0 0 5 1 0 0 0
0 0 0 0 0 6 5 0 0
0 7 0 3 0 0 0 8 0
0 0 3 0 0 0 0 0 0
0 0 0 0 8 0 0 0 0
5 8 0 0 0 0 9 0 0
6 9 0 0 0 0 0 0 0
这是我的输出:
7 4 9 2 3 8 6 1 5
1 5 2 6 9 7 8 3 4
8 3 6 4 5 1 2 7 9
2 1 8 9 7 6 5 4 3
9 7 5 3 2 4 1 8 6
4 6 3 8 1 5 7 9 2
3 2 1 5 8 9 4 6 7
5 8 4 7 6 3 9 2 1
6 9 7 1 4 2 3 5 8
现在我打算为这个数独添加一个新的条件,这个可以在这个过程中为4个3 * 3的盒子做这个过程(这个名为Hyper-Sudoku):
对于我的谜题,它会返回:
9 4 6 8 3 2 7 1 5
1 5 2 6 9 7 8 3 4
7 3 8 4 5 1 2 9 6
8 1 9 7 2 6 5 4 3
4 7 5 3 1 9 6 8 2
2 6 3 5 4 8 1 7 9
3 2 7 9 8 5 4 6 1
5 8 4 1 6 3 9 2 7
6 9 1 2 7 4 3 5 8
有没有办法将此选项添加到我的数独,我必须更改我的整个算法?
感谢您的回答。
答案 0 :(得分:3)
我认为你的程序看起来很棒。由于您将isValid
和solve
功能分开,因此可以更轻松地添加更改。您只需要修改isValid
函数。
def isValid(num, x, y):
# row and column check
for i in range(9):
if board[i][y] == num:
return False
if board[x][i] == num:
return False
# 3x3 tile check
row = x - x % 3
col = y - y % 3
for i in range(3):
for j in range(3):
if board[i + row][j + col] == num:
return False
# Hypersudoku check
if x not in [0, 4, 8] and y not in [0, 4, 8]:
row = 1 if x < 4 else 5
col = 1 if y < 4 else 5
for i in range(3):
for j in range(3):
if board[i + row][j + col] == num:
return False
return True