Swift 快速回溯N皇后
我正在努力解决N皇后的问题。 你可以从中找到问题所在 对于回溯,我了解到我们可以用三个键来解决问题:Swift 快速回溯N皇后,swift,algorithm,recursion,backtracking,n-queens,Swift,Algorithm,Recursion,Backtracking,N Queens,我正在努力解决N皇后的问题。 你可以从中找到问题所在 对于回溯,我了解到我们可以用三个键来解决问题: 作出选择 约束条件 目标 所以我提出了这个解决方案: func-solvenquens(\un:Int)->[[String]]{ typealias棋盘=[[Int]] var result=Set() func getIndexOfDiagonal(行:Int,列:Int)->[(行:Int,列:Int)]{ var indexs=[(Int,Int)]() var ROWDINDEX=行
func-solvenquens(\un:Int)->[[String]]{
typealias棋盘=[[Int]]
var result=Set()
func getIndexOfDiagonal(行:Int,列:Int)->[(行:Int,列:Int)]{
var indexs=[(Int,Int)]()
var ROWDINDEX=行
var colIndex=列
而行索引=0&&colIndex>=0{
追加((行索引,共索引))
行索引-=1
colIndex-=1
}
行索引=行
colIndex=列
而行索引>=0&&colIndex=0{
追加((行索引,共索引))
行索引+=1
colIndex-=1
}
返回指数
}
func placeQuees(棋盘:棋盘,行:Int,列:Int)->棋盘{
var newChessBorad=棋盘
//排
对于0..中的索引,您的解决方案是回溯。当它无法再找到可用空间(棋盘[row][col]==0
)来放置皇后时,它会回溯。因为它会找到所有可能的解决方案,所以它也会在找到解决方案并将其插入结果后回溯
您的解决方案只是在每次调用solve
时尝试了太多的尝试位置。请注意,任何给定行上都只能有一个皇后。因此,solve
可以通过在每次调用solve
时只在一行上放置皇后来更有效地工作。在第一次调用solve
时,请尝试将皇后放置在第0行
。然后,您将只考虑n
可能的放置位置,而不是n*n
。在第二次调用solve
时,尝试将皇后放置在第1行
。当前的行
可以计算为n
减去剩余皇后数或n-皇后数
通过这一细微的修改,您的代码在提交到LeetCode时运行得更快并成功通过:
func solve(chessboard:ChessBoard, queens: Int) {
if queens == 0 {
//Goal
result.insert(chessboard)
}
else {
let row = n - queens
for col in 0..<n {
//Choices
if chessboard[row][col] == 0 {
//Constraints
let new = placeQuees(chessboard: chessboard, row: row, column: col)
solve(chessboard: new, queens: queens - 1)
}
}
}
}
func solve(棋盘:棋盘,皇后:Int){
如果queens==0{
//目标
结果.插入(棋盘)
}
否则{
设row=n-皇后
对于0..@vacawama中的col,我知道这个想法,但我想知道我的解决方案出了什么问题。谢谢。我投票决定将此问题作为离题问题来结束,因为它属于,因为它涉及如何改进已在运行的代码。在问您的问题之前,请确保查看该网站的帮助页面,以确保您的正确性根据网站的规则,以主题的方式模拟你的问题。