N-Queens -- 回溯法 -- 力扣101算法题解笔记

6.3N-Queens -- 回溯法

题目描述

先说一下,这个题目十分之困难。

给定一个大小为n的正方形国际象棋棋盘,求有多少种方式可以放置n个皇后,并使得她们互不攻击,即每一行、列、左斜、右斜最多只有一个皇后

输入输出样例

Input :4

Output: [[".Q..", "...Q","Q...","..Q."], // Solution 1

"..Q.", "Q...","...Q",".Q.."\]\] // Solution 2 注:.表示空白位置,Q代表皇后 ### 题解 类似于在矩阵中寻找字符串,本体也是通过修改状态矩阵来进行回溯操作,不同的是,我们需要对每一行列,左斜右斜,建立访问数组,来记录他们是否存在皇后。 注意,本题有一个隐藏条件,是满足条件的结果中每一行或列有且仅有一个皇后。这是因为我们一共只有n行n列。所以,**如果我们通过对每一行遍历来插入皇后,我们就不需要对行建立访问数组了。** 这个是缓解这题难度的关键 ```cpp #include #include using namespace std; void backtracking(vector>& ans, vector& board, vector &column, vector &ldiag, vector &rdiag, int row, int n) { if (row == n) { ans.push_back(board); return; } for (int i = 0; i < n; ++i) { if (column[i] || ldiag[n - row + i - 1] || rdiag[row + i + 1]) { continue; } //修改当前节点状态 board[row][i] = 'Q'; column[i] = ldiag[n - row + i - 1] = rdiag[row + i + 1] = true; //递归子节点 backtracking(ans, board, column, ldiag, rdiag, row + 1, n); //回改当前节点状态 board[row][i] = '.'; column[i] = ldiag[n - row + i - 1] = rdiag[row + i + 1] = false; } } vector> solveNQueens(int n) { vector> ans; if (n == 0) { return ans; } vector board(n, string(n, '.')); vector column(n, false), ldiag(2 * n - 1, false), rdiag(2 * n - 1, false); backtracking(ans, board, column, ldiag, rdiag, 0, n); return ans; } int main() { int n = 4; vector> res = solveNQueens(n); for (int i = 0; i < res.size(); ++i) { cout << "["; for (int j = 0; j < res[i].size(); ++j) { cout << " \"" << res[i][j] << "\""; if (j != res[i].size() - 1) { cout << ","; } cout << endl; } if (i != res.size() - 1) { cout << " ]," << endl; } else { cout << " ]" << endl; } cout << " // Solution " << i + 1 << endl; } cout << "]" << endl; return 0; } ```

相关推荐
minji...3 小时前
Linux 进程信号(二)信号的保存,sigset_t,sigprocmask,sigpending
linux·运维·服务器·网络·数据结构·c++·算法
罗湖老棍子4 小时前
最大数(信息学奥赛一本通- P1549)(洛谷-P1198)
数据结构·算法·线段树·单点修改 区间求最大值
DynamicsAgg4 小时前
企业数字化底座-k8s企业实践系列第二篇pod创建调度
java·容器·kubernetes
森林里的程序猿猿4 小时前
并发设计模式
java·开发语言·jvm
222you4 小时前
四个主要的函数式接口
java·开发语言
Javatutouhouduan4 小时前
Java全栈面试进阶宝典:内容全面,题目高频!
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
SEO-狼术5 小时前
RAD Studio 13.1 Florence adds
java
小O的算法实验室5 小时前
2026年KBS,赏金猎人优化算法+多无人机移动边缘计算与路径规划,深度解析+性能实测
算法·无人机·边缘计算
ywf12155 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
用户5671504710215 小时前
OpenClaw 记忆管理系统技术文档
算法