牛客网 面试笔试 TOP 101 | LeetCode 52. N 皇后 II
N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
数据范围: 1≤n≤9
要求:空间复杂度 O(1) ,时间复杂度 O(n!)
例如当输入4时,对应的返回值为2,
对应的两种四皇后摆位如下图所示:

输入:
1
返回值:
1
输入:
8
返回值:
92
N皇后的摆放问题可以通过回溯算法完成。结合回溯算法模板,对应的思路如下:


如果文字描述的不太清楚,你可以参考视频的详细讲解:B站@好易学数据结构
核心代码如下:
var count int
func totalNQueens(n int) int {
board := make([][]bool, n)
for i := 0; i < n; i++ {
board[i] = make([]bool, n)
}
// 调用回溯函数,获取结果
backtracking(board, 0)
return count
}
func backtracking(board [][]bool, row int) {
// 2.递归终止条件:分枝进入结尾,找到一种排列,加入到输出列表
if row == len(board) {
//2.1 存放结果(找到一个解)
count++
//2.2 返回
return
}
//1.选择:在本层集合中遍历元素
for col := 0; col < len(board); col++ {
if isSafe(board, row, col) {
//1.1 处理节点(放置皇后)
board[row][col] = true
// 1.2 递归(继续下一行)
backtracking(board, row+1)
//1.3 回溯,撤销选择(移除皇后)
board[row][col] = false
}
}
}
// 皇后安全性检查(皇后们不能:同一行、同一列、左对角线、右对角线)
func isSafe(board [][]bool, row int, col int) bool {
// 检查 同一行 是否有皇后互相攻击
for j := 0; j < col; j++ {
if board[row][j] {
return false
}
}
// 检查 同一列 是否有皇后互相攻击
for i := 0; i < row; i++ {
if board[i][col] {
return false
}
}
// 检查 左上对角线 是否有皇后互相攻击
for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {
if board[i][j] {
return false
}
}
// 检查 右上对角线 是否有皇后互相攻击
for i, j := row-1, col+1; i >= 0 && j < len(board); i, j = i-1, j+1 {
if board[i][j] {
return false
}
}
// 如果上述检查都通过,则当前位置是安全的
return true
}具体完整代码你可以参考下面视频的详细讲解。
N皇后的摆放问题可以通过回溯算法完成。具体操作为:在每一列尝试放置皇后(Q)。对于一列来说,具有n行的放置可能,首先判断安全性(任何两个皇后不同行,不同列也不在同一条斜线上),再放置皇后,放置完之后进行递归(继续下一行)、回溯(移除皇后)。

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:
✅ 链表
✅ 二叉树
✅ 二分查找、排序
✅ 堆、栈、队列
✅ 回溯算法
✅ 哈希算法
✅ 动态规划
无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!
对于数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。
今日佳句:取之有度,用之有节,则常足。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。