Я пытался создать алгоритм решения судоку, используя python и основанный на возврате, но он всегда ничего не возвращал, говоря, что судоку неверно.
Вот мой код:
board = [[3,0,6,5,0,8,4,0,0],
[5,2,0,0,0,0,0,0,0],
[0,8,7,0,0,0,0,3,1],
[0,0,3,0,1,0,0,8,0],
[9,0,0,8,6,3,0,0,5],
[0,5,0,0,9,0,6,0,0],
[1,3,0,0,0,0,2,5,0],
[0,0,0,0,0,0,0,7,4],
[0,0,5,2,0,6,3,0,0]]
e = [0, 0]
def checkEmpty():
for i in range(0, 9):
for j in range(0, 9):
if board[i][j] == 0:
e[0] = i
e[1] = j
return True
return False
def vLine(i, test):
for j in range(9):
if board[i][j] == test:
return True
return False
def vColumn(j, test):
for i in range(9):
if board[i][j] == test:
return True
return False
def vBlock(i, j, test):
for I in range(3):
for J in range(3):
if(board[i+I][j + J] == test):
return True
return False
def validMove(i, j, test):
if vColumn(j, test) == False and vBlock(i, j, test) == False and vLine(i, test) == False:
return True
else:
return False
def solve():
e = [0, 0]
if checkEmpty() == False:
return True
i = e[0]
j = e[1]
for k in range(1, 10):
if validMove(i, j, k) == True:
board[i][j] = k
if solve() == True:
return True
board[i][j] = 0
return False
if solve():
print("solved!")
else:
print("No solution exists")
Проблема в том, что код внутри этой функции if validMove(i, j, k) == True:
, кажется, никогда не выполняется.
Однако я не смог найти ни одной ошибки в этой функции.
Кроме того, я на самом деле не знаю, должен ли я сделать отступ, отступ или оставить эту строку board[i][j] = 0
здесь.