要求

  • 将n个皇后摆放在n*n的棋盘中,使横、竖和两个对角线方向均不会同时出现两个皇后

思路

  • 尝试在一行中摆放,如果摆不下,回到上一行重新摆放,直到所有行都摆下
  • 快速判断不合法情况
    • 竖向:col[i]表示第i列被占用
    • 对角线1(右上--左下):共2*n-1条,dia1[i]表示第i对角线1被占用
    • 对角线2(左上--右下):共2*n-1条,元素索引为i-j+n-1,dia2[i]表示第i对角线2被占用

     

          

实现

  • row:记录摆放结果,row[i]=k 表示第 i 行第 k 列有皇后
  • generateBoard():将结果转换为棋盘格形式输出
  • 27-30:回溯,比如4皇后问题,将第一行皇后摆在第一列后,尝试将第二行皇后摆在第三列(与第一行并不冲突),但发现第三行皇后无法摆放,于是返回,尝试将第二行皇后摆在第四列
  • 也就是说子问题只有完成最后一步尝试才能确定是否有解,例如你在转正前一天被发现偷公司的东西,试用期没过,人力需要把你的档案删除掉

 1 #include <vector>
2 #include <iostream>
3 #include <assert.h>
4 using namespace std;
5
6 class Solution {
7
8 private:
9 vector<vector<string>> res;
10 vector<bool> col, dia1, dia2;
11
12 // 尝试在一个n皇后问题中,摆放第index行的皇后位置
13 void putQueen(int n ,int index, vector<int> &row){
14 if( index == n){
15 res.push_back( generateBoard(n,row) );
16 return;
17 }
18
19 for( int i = 0 ; i < n ; i ++ )
20 // 尝试将第index行的皇后摆放在第i列
21 if( !col[i] && !dia1[index+i] && !dia2[index-i+n-1]){
22 row.push_back(i);
23 col[i] = true;
24 dia1[index+i] = true;
25 dia2[index-i+n-1] = true;
26 putQueen(n, index+1, row);
27 col[i] = false;
28 dia1[index+i] = false;
29 dia2[index-i+n-1] = false;
30 row.pop_back();
31 }
32 return;
33 }
34
35 vector<string> generateBoard( int n, vector<int> &row){
36 assert( row.size() == n );
37 vector<string> board(n, string(n,'.'));
38 for( int i = 0 ; i < n ; i ++ )
39 board[i][row[i]] = 'Q';
40 return board;
41 }
42
43 public:
44 vector<vector<string>> solveNQueens(int n) {
45
46 res.clear();
47
48 col = vector<bool>(n,false);
49 dia1 = vector<bool>(2*n-1, false);
50 dia2 = vector<bool>(2*n-1, false);
51
52 vector<int> row;
53 putQueen(n,0,row);
54
55 return res;
56 }
57 };
58
59 int main(){
60
61 int n = 4;
62 vector<vector<string>> res = Solution().solveNQueens(n);
63 for( int i = 0 ; i < res.size() ; i ++ ){
64 for( int j = 0 ; j < n ; j ++ )
65 cout << res[i][j] << endl;
66 cout << endl;
67 }
68 return 0;
69 }

相关

  • 52 N-Queens II
  • 37 Sudoku Solver

[刷题] 51 N-Queens的更多相关文章

  1. 【刷题记录】BZOJ-USACO

    接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...

  2. LeetCode 刷题指南(1):为什么要刷题

    虽然刷题一直饱受诟病,不过不可否认刷题确实能锻炼我们的编程能力,相信每个认真刷题的人都会有体会.现在提供在线编程评测的平台有很多,比较有名的有 hihocoder,LintCode,以及这里我们关注的 ...

  3. 83.(01背包)CYD刷题

    3130 CYD刷题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 下午,CYD要刷题了,已知CY ...

  4. leetcode 刷题记录(java)-持续更新

    最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...

  5. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  6. C#LeetCode刷题-二叉搜索树

    二叉搜索树篇 # 题名 刷题 通过率 难度 220 存在重复元素 III   19.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 327 区间和的个数   29.5% 困难 3 ...

  7. C#LeetCode刷题-深度优先搜索

    深度优先搜索篇 # 题名 刷题 通过率 难度 98 验证二叉搜索树   22.2% 中等 99 恢复二叉搜索树   45.1% 困难 100 相同的树   48.1% 简单 101 对称二叉树   4 ...

  8. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历   61.6% 中等 95 不同的二叉搜索树 II   43.4% 中等 96 不同的二叉搜索树   51.6% 中等 98 验证二叉搜索树 ...

  9. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集   67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...

随机推荐

  1. 【10.5NOIP普及模拟】sort

    [10.5NOIP普及模拟]sort 文章目录 [10.5NOIP普及模拟]sort 题目描述 输入 输出 输入输出样例 样例输入 样例输出 数据范围限制 解析 code 题目描述 小x和小y是好朋友 ...

  2. [Fundamental of Power Electronics]-PART I-6.变换器电路-6.4 变换器评估与设计/6.5 重点与小结

    6.4 变换器评估与设计 没有完美适用于所有可能应用场合的统一变换器.对于给定的应用和规格,应该进行折中设计来选择变换器的拓扑.应该考虑几种符合规格的拓扑,对于每种拓扑方法,对比较重要的量进行计算,比 ...

  3. 轻松理解 Spring AOP

    目录 Spring AOP 简介 Spring AOP 的基本概念 面向切面编程 AOP 的目的 AOP 术语和流程 术语 流程 五大通知执行顺序 例子 图例 实际的代码 使用 Spring AOP ...

  4. OOJML系列总结

    目录 0x0 JML理论相关 0.0 概念及作用 0.1 JML语法学习 0x1 使用openJml以及JMLUnitNG 1.0 使用openjml 1.1使用JMLUnitNG 0x2 作业架构设 ...

  5. Gateway的限流重试机制详解

    前言 想要源码地址的可以加上此微信:Lemon877164954  前面给大家介绍了Spring Cloud Gateway的入门教程,这篇给大家探讨下Spring Cloud Gateway的一些其 ...

  6. 万字长文,带你彻底理解EF Core5的运行机制,让你成为团队中的EF Core专家

    在EF Core 5中,有很多方式可以窥察工作流程中发生的事情,并与该信息进行交互.这些功能点包括日志记录,拦截,事件处理程序和一些超酷的最新出现的调试功能.EF团队甚至从Entity Framewo ...

  7. 数据库MySQL四

    一.测试题 二.复习 说明:sql中的函数分为单行函数和分组函数 调用语法:select 函数名(实参列表); 1>字符函数 concat(str1,str2,..):拼接字符 substr(s ...

  8. Oracle-buffer cache过小导致SQL执行时间长

    一.问题:客户反馈在生产库和测试库执行相同SQL,测试库执行比生产库慢一倍 问题摆在这里,需要进行分析? 啥??? 版本11.2.0.4,都是单实例,主机系统硬件配置差不多. 二.对比SQL的执行效率 ...

  9. rpm 和 yum 软件管理

    软件安装总结: 安装软件方式有如下几种: 方式1:编译安装 将源码程序按照需求进行先编译,后安装 缺点: 安装过程复杂,而且很慢 优点: 安装过程可控,真正的按需求进行安装(安装位置.安装的模块都可以 ...

  10. 关于搭建FTP服务器

    首先我们创建一个用户账户用于登录FTP进行操作.右键点击桌面的我的点击选择管理选项,进入管理界面打开本地用户和组选项,我们可以看到列表中的用户选项 2 然后右键用户选项,在下拉菜单中选择新用户,开始建 ...