【发布时间】:2019-12-20 13:52:57
【问题描述】:
我试图在 swift 中为数独求解器实现回溯解决方案。这是我的代码:
func solve(board: [[Int]]) -> (isSolved: Bool, board: [[Int]]){
var board = board
var empty_pos: (Int, Int)
var check_empty = findEmpty(board: board)
if check_empty.isEmpty == false{
return (true, board)
}else{
empty_pos = check_empty.pos
for num in 1..<10{
if isValid(board: board, num: num, pos: empty_pos){
board[empty_pos.0][empty_pos.1] = num
if solve(board: board).isSolved{
return (true, board)
}else{
board[empty_pos.0][empty_pos.1] = 0
}
}
}
}
return (false, board)}
当我运行代码时,函数返回 true 与原始板。但是,当我在 ifsolved 块中打印板时,我注意到该函数解决了板,但它没有返回它,并继续调用该函数,直到它使所有 0 值再次变为 0。我认为该功能不会在 if solve(board: board).isSolved 部分中退出。我应该怎么做才能解决这个问题?谢谢!
【问题讨论】:
-
我建议你创建一个
SudokuBoard结构来抽象[[Int]]。然后,您可以在其上创建一个solve方法,返回SudokuBoard?、nil(无解决方案)或已解决的板。 -
我还建议不要在循环很容易完成的情况下使用递归。
标签: ios swift recursion backtracking sudoku