CSP递归调用失败,范围为(a,b),但不是显式范围



数独是一个众所周知的CSP,在这种情况下,它是LC问题。我不需要下面的解决方案。

我的问题是为什么self.DOMAIN = "123456789"(第4行(有效,而self.DOMAIN = map(str, range(1, 10))(第5行(无效?它们不对等吗?

class Solution:
def __init__(self):
self.SIZE = 9
# self.DOMAIN = map(str, range(1, self.SIZE + 1)) # THIS DES NOT WORK NOT WORK
self.DOMAIN = "123456789" # THIS WORKS
self.EMPTY = "."
from collections import defaultdict
self.rows = defaultdict(set) # {row:set}
self.cols = defaultdict(set) # {col:set}
self.boxs = defaultdict(set) # {box:set}

self.row_idx = lambda cell: cell // self.SIZE # determines row from cell num
self.col_idx = lambda cell: cell % self.SIZE  # determins col from cell num
self.box_idx = lambda r, c: (r // 3) * 3 + c // 3 # determines box from row, col


def solveSudoku(self, board: List[List[str]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
assert(len(board) == self.SIZE and len(board[0]) == self.SIZE), 
"Sudoku board must be 9x9 in dimensions"

# Initialize board state
self.board = board
for r in range(self.SIZE):
for c in range(self.SIZE):
val = self.board[r][c]
if val != self.EMPTY:
self.rows[r].add(val)
self.cols[c].add(val)
self.boxs[self.box_idx(r, c)].add(val)

# Begin backtracking search from the first cell
self.backtrack(0)

def backtrack(self, cell):
if cell == 81:
# all values have been set and we are outside the board range
return True

r, c = self.row_idx(cell), self.col_idx(cell)
if self.board[r][c] != self.EMPTY:
# nothing to do, continue search
return self.backtrack(cell + 1)

# explore values in the domain for this cell
for candidate_val in self.DOMAIN:
if self.is_valid(r, c, candidate_val):
# place candidate
self.board[r][c] = candidate_val
self.rows[r].add(candidate_val)
self.cols[c].add(candidate_val)
self.boxs[self.box_idx(r, c)].add(candidate_val)

# continue search
if self.backtrack(cell + 1):
return True

# remove candidate and backtrack
self.board[r][c] = self.EMPTY
self.rows[r].remove(candidate_val)
self.cols[c].remove(candidate_val)
self.boxs[self.box_idx(r, c)].remove(candidate_val)

# no solution found for all values in the domain for this cell 
return False

def is_valid(self, r, c, val):
""" Returns whether a value can be placed in board[r][c] in the current game state """

if val in self.rows[r]:
return False
if val in self.cols[c]:
return False
if val in self.boxs[self.box_idx(r, c)]:
return False
return True

您正在遭受"发电机";以及";容器";。请参阅type( ... )来区分它们。

Python生成器是";懒惰";,出于良好的技术原因。有时我们只需评估无穷生成器的前K项。

在你的方法中,你想贪婪地把所有东西都拔出来,然后储存在容器中。表达这一点的传统方法是用list:包裹map

self.DOMAIN = list(map(str, range(1, 10)))

或者在你的情况下,你可能更喜欢.join把它们拔出来:

self.DOMAIN = ''.join(map(str, range(1, 10)))

最新更新