1 题目

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

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

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

2 解法

以行 为遍历单位, 依次确定每行的Q的列数, 并用位运算的方式记录每个列, 两条斜线是否已经被占用, 并用递归(感觉不用递归也可以, 毕竟是二维的)的方式调用下一行, 至于回溯的方式就是, 当行的每一个列完成后要把其位置退出来:

class Solution {
public:int Q_num;int col;int row_plus_col;int row_col_plus_n_1;void do_flip(int r_idx, int c_idx){col ^= (1 << c_idx);row_plus_col ^= (1 << (r_idx + c_idx));row_col_plus_n_1 ^= (1 << (r_idx - c_idx + Q_num - 1));}void dfs(vector<pair<int, int>> &tmp_Q_pos, vector<vector<pair<int, int>>> &all_Q_pos, int cur_r_idx) {if (cur_r_idx == Q_num) {all_Q_pos.push_back(tmp_Q_pos);return;}int c_idx = 0;while (c_idx < Q_num) {if ((col & (1 << c_idx)) == 0 &&(row_plus_col & (1 << (cur_r_idx + c_idx))) == 0 &&(row_col_plus_n_1 & (1 << (cur_r_idx - c_idx + Q_num - 1))) == 0) {do_flip(cur_r_idx, c_idx);tmp_Q_pos.push_back(make_pair(cur_r_idx, c_idx));dfs(tmp_Q_pos, all_Q_pos, cur_r_idx + 1);tmp_Q_pos.pop_back();do_flip(cur_r_idx, c_idx);}c_idx ++;}}vector<vector<string>> solveNQueens(int n) {Q_num = n;col = 0;row_plus_col = 0;row_col_plus_n_1 = 0;vector<vector<pair<int, int>>> all_Q_pos;vector<pair<int, int>> tmp_Q_pos;dfs(tmp_Q_pos, all_Q_pos, 0);vector<vector<string>> all_res(all_Q_pos.size(), vector<string>(n, string(n, '.')));for (int res_index = 0; res_index < all_Q_pos.size(); res_index ++) {for_each(all_Q_pos[res_index].begin(), all_Q_pos[res_index].end(), [&](auto pair){all_res[res_index][pair.first][pair.second] = 'Q';});}return all_res;}
};

leetcode51 --- solveNQueens相关推荐

  1. leetcode51. N皇后

    leetcode51. N皇后 题目描述 链接: leetcode51. n皇后问题 研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 n ,返回所有不 ...

  2. 代码随想录算法训练营第三十天| LeetCode332. 重新安排行程、LeetCode51. N 皇后、LeetCode37. 解数独

    一.LeetCode332. 重新安排行程 1:题目描述(32. 重新安排行程) 给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场 ...

  3. leetcode51 N皇后

    题目: N皇后问题:将n个皇后放置在\(n\times n\)的棋盘上,并且皇后彼此之间不能相互攻击.给定一个整数n,返回所有不同n皇后问题的具体解. 示例: 输入: 4 输出: [ [". ...

  4. Leetcode51 n皇后 DFS+回溯(模板题)

    n皇后 链接 n皇后问题是说给定n*n的棋盘和n个皇后,求出所有合理的摆法.所谓合理的摆法是说n个皇后可以平安无事的处于棋盘上.国际象棋中皇后可以横着走.竖着走.斜着走,只要处于这些位置,皇后就会杀掉 ...

  5. leetcode51. N 皇后(回溯算法)

    n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解 ...

  6. 【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II

    回溯 回溯(Back Tracking) 提出八皇后问题(Eight Queens) 初步思路一:暴力出奇迹 初步思路二:根据题意减少暴力程度 初步思路三:回溯法(回溯+剪枝) 四皇后 - 回溯法图示 ...

  7. leetcode51. N 皇后 (java)

    leetcode 51 N 皇后 leetcode 51 N 皇后 题目描述 解题思路 代码演示 leetcode52 N 皇后II leetcode 51 N 皇后 原题链接: https://le ...

  8. 回溯算法总结(java)

    回溯算法 回溯法按深度优先策略搜索问题的解空间树.首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解).如果不可行,则跳过对该节点为根的 ...

  9. 回溯算法解子集、组合、排序

    转载labuladong:力扣 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor ...

最新文章

  1. 分享一下@Override标签背后的小秘密---记录java的思行合一
  2. python对文件的操作模式_python对文件的操作
  3. Swoole安装报错No releases available for package pecl.php.net/swoole
  4. Map 遍历取值及jstl的取值
  5. 稳定的货源社区新版云乐购免费开源源码
  6. luoguP2701 [USACO5.3]巨大的牛棚Big Barn(极大子矩阵)
  7. matplotlib绘制K线图
  8. 微信公众号web端关闭本页面
  9. 洛谷——P1001 A+B Problem
  10. 嵌入式基础面八股文——死锁与饥饿(4)
  11. 【kmp】POJ-3461 Oulipo
  12. 图像形态学运算之腐蚀-膨胀篇
  13. ddk高级主题和提示
  14. Wordpress 网站设计入门 把Wordpress放在一个独立子目录下
  15. 基于信创运维平台,实现国产化网络自动巡检
  16. 郑州轻工业大学 2021-2022(1)期末模拟测试一 答案
  17. win7删除Guest和administrator内置账户及账户所属文件
  18. 理财就是理生活 —— 小白理财训练营(上)
  19. jrtplib收发实例
  20. 使用爬虫抓取淘宝商品数据

热门文章

  1. msk 频偏_一种MSK-Type信号的频率同步改进算法
  2. python数学公式pdf文件的转换_python转换文件 多种文件转换为pdf
  3. 一维和二维卷积和池化
  4. 吴恩达《机器学习》学习笔记十一——神经网络代码
  5. Cocos2dx实现象棋之布局
  6. Python 执行 shell命令 的几个方法小结
  7. CompletableFuture详解~设置任务结果
  8. Separate Query from Modifier(分离查询和修改)
  9. Java测试驱动开发--总结
  10. js的 ajax获取后台数据,如何通过js来获取后台数据