51. N 皇后 (Swift 版本)

news/2024/7/20 5:01:57 标签: swift, 开发语言, ios

题目

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/n-queens

示例1

在这里插入图片描述

输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例2

输入:n = 1
输出:[[“Q”]]

提示

1 <= n <= 9

Show The Swift Code

swift">class Solution {
    func solveNQueens(_ n: Int) -> [[String]] {
        var solutions = [[String]]()
        var queens: [Int] = Array(repeating: -1, count: n)
        var columns = Set<Int>()
        var diagonals1 = Set<Int>()
        var diagonals2 = Set<Int>()
        backtrack(solutions: &solutions, queens: &queens, n: n, row: 0, columns: &columns, diagonals1: &diagonals1, diagonals2: &diagonals2)
        return solutions
    }
    
    private final func backtrack(solutions: inout [[String]], queens: inout [Int], n: Int, row: Int, columns: inout Set<Int>, diagonals1: inout Set<Int>, diagonals2: inout Set<Int>) {
        guard row != n else {
            let board: [String] = generateBoard(queens, n)
            solutions.append(board)
            return
        }
        for col in 0..<n {
            if columns.contains(col) {
                continue
            }
            let diag1 = row - col
            if diagonals1.contains(diag1) {
                continue
            }
            let diag2 = row + col
            if diagonals2.contains(diag2) {
                continue
            }
            queens[row] = col
            columns.insert(col)
            diagonals1.insert(diag1)
            diagonals2.insert(diag2)
            backtrack(solutions: &solutions, queens: &queens, n: n, row: row + 1, columns: &columns, diagonals1: &diagonals1, diagonals2: &diagonals2)
            queens[row] = -1
            columns.remove(col)
            diagonals1.remove(diag1)
            diagonals2.remove(diag2)
        }
    }
    
    private final func generateBoard(_ queens: [Int], _ n: Int) -> [String] {
        var board = [String]()
        for columnIntValue in queens {
            var rowDisplay: [Character] = Array(repeating: ".", count: n)
            rowDisplay[columnIntValue] = "Q"
            board.append(String(rowDisplay))
        }
        return board
    }
}

http://www.niftyadmin.cn/n/91387.html

相关文章

LMR23630APQDRRTQ1应用INA2181A1QDGSRQ1电流检测放大器电路图

LMR23630/LMR23630-Q1 SIMPLE SWITCHER降压转换器是易于使用的36V、3A同步降压稳压器。该器件的宽输入电压范围为 4.5V 至 36V&#xff0c;适用于调节从工业到汽车等各类应用中非稳压电源的电源调理。采用了峰值电流模式控制&#xff0c;以实现对环路补偿和逐周期电流限制的简单…

Linux多媒体子系统01:从用户空间使用V4L2子系统

1 V4L2应用编程基础1.1 概述V4L2应用编程需要使用如下系统调用&#xff0c;open(): 打开V4L2设备 close(): 关闭V4L2设备 ioctl(): 向V4L2设备驱动程序发送控制命令 mmap(): 将V4L2设备驱动程序分配的缓冲区内存映射到用户空间 read()或write(): 这2个系统调用是否支持取决于流…

JavaUDP通信程序

2 UDP通信程序 2.1 UDP通信原理 UDP协议是一种不可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象, 但是这两个Socket只是发送&#xff0c;接收数据的对象因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念 Java提供了DatagramSocket类作为基…

面试 | 递归乘法【细节决定成败】

不用[ * ]如何使两数相乘❓一、题目明细二、思路罗列 & 代码解析1、野蛮A * B【不符合题意】2、sizeof【可借鉴】解析3、简易递归【推荐】① 解析&#xff08;递归展开图&#xff09;② 时间复杂度分析4、移位<<运算【有挑战性&#x1f4aa;】① 思路顺理② 算法图解…

双指针 (C/C++)

1. 双指针 双指针算法的核心思想&#xff1a;将暴力解法的时间复杂度&#xff0c;通常是O(N*N)&#xff0c;通过某种特殊的性质优化到O(N)。 做题思路&#xff1a;先想想暴力解法的思路&#xff0c;然后分析这道题的特殊性质&#xff0c;一般是单调性。然后得出双指针算法的思路…

华为OD机试 C++ 实现 - 任务混部

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

浅谈CAS原理。

文章目录1.场景引入&#xff0c;问题凸现2.更高效的方案&#xff1a;AtomicXXXX 原子类3.什么是CAS&#xff1f;4.CAS的缺点5.遗留的两个问题&#xff1a;6.ABA问题7.ABA问题解决8.小结1.场景引入&#xff0c;问题凸现 示例程序&#xff1a;启动两个线程&#xff0c;每个线程中…

MySQL 数据库基础命令

MySQL 基础命令 一.了解数据库 1、了解数据库对象 1.表&#xff1a; 用于以有组织方式存储数据。以行和列的格式包含数据。 2.索引&#xff1a; 是内部表结构&#xff0c;MySQL 用它基于一列或多列的值来提供对表中各行的快速访问。 3.视图&#xff1a; 是虚拟表&#…