Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 快速回溯N皇后_Swift_Algorithm_Recursion_Backtracking_N Queens - Fatal编程技术网

Swift 快速回溯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=行

我正在努力解决N皇后的问题。 你可以从中找到问题所在

对于回溯,我了解到我们可以用三个键来解决问题:

  • 作出选择

  • 约束条件

  • 目标

  • 所以我提出了这个解决方案:

    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,我知道这个想法,但我想知道我的解决方案出了什么问题。谢谢。我投票决定将此问题作为离题问题来结束,因为它属于,因为它涉及如何改进已在运行的代码。在问您的问题之前,请确保查看该网站的帮助页面,以确保您的正确性根据网站的规则,以主题的方式模拟你的问题。