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; } ```

相关推荐
自我意识的多元宇宙19 小时前
树与二叉树--二叉树的存储结构
数据结构
不吃香菜学java20 小时前
Redis的java客户端
java·开发语言·spring boot·redis·缓存
captain37620 小时前
事务___
java·数据库·mysql
北漂Zachary20 小时前
四大编程语言终极对比
android·java·php·laravel
小江的记录本20 小时前
【网络安全】《网络安全常见攻击与防御》(附:《六大攻击核心特性横向对比表》)
java·网络·人工智能·后端·python·安全·web安全
白羊by20 小时前
YOLOv1~v11 全版本核心演进总览
深度学习·算法·yolo
嗑嗑嗑瓜子的猫21 小时前
Java!它值得!
java·开发语言
墨尘笔尖1 天前
最大最小值降采样算法的优化
c++·算法
2401_895521341 天前
【Spring Security系列】Spring Security 过滤器详解与基于JDBC的认证实现
java·后端·spring
皮卡蛋炒饭.1 天前
线程的概念和控制
java·开发语言·jvm