要求

  • 将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. 第28 章 : 理解容器运行时接口 CRI

    理解容器运行时接口 CRI CRI 是 Kubernetes 体系中跟容器打交道的一个非常重要的部分.本文将主要分享以下三方面的内容: CRI 介绍 CRI 实现 相关工具 CRI 介绍 在 CRI ...

  2. [Fundamental of Power Electronics]-PART II-7.交流等效电路建模-7.1 引言

    7.1 引言 变换器系统总是需要反馈的.例如,在典型的DC-DC变换器应用中,无论输入电压\(V_{g}(t)\)和输出有效负载\(R\)如何变化,都必须使输出电压\(v(t)\)保持恒定.这是通过构 ...

  3. Python面向对象的高级编程

    数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ ...

  4. go中panic源码解读

    panic源码解读 前言 panic的作用 panic使用场景 看下实现 gopanic gorecover fatalpanic 总结 参考 panic源码解读 前言 本文是在go version ...

  5. JAVAEE_Servlet_10_HTTP协议

    HTTP协议 * 什么是HTTP 协议? - HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数 ...

  6. Day11_49_HashTable

    HashTable * HashTable是较早期的使用Hash算法的一种容器结构,现在基本已被淘汰,单线程多使用HashMap,多线程使用ConcurrentHashMap. * HashTable ...

  7. kafka配置内外网访问

    使用docker简单部署测试 zookeeper mkdir data conf chmod 777 data 启动命令 docker run -itd -p 2181:2181 -e ALLOW_A ...

  8. PAT归纳总结——关于二叉树的一些总结

    今天是6月26日到下个月的这个时候已经考过试了,为了让自己考一个更高的分数,所以我打算把PAT的相关题型做一个总结.目前想到的方法就是将相关的题型整理到一起然后,针对这种题型整理出一些方法. 二叉树的 ...

  9. 01- APP移动端测试怎么测试?APP测试方法大全。

    由于智能手机时代来临,很多产品都有了APP,作为一个测试人员掌握APP测试是必要的. 在展开APP测试之前,首先了解一下几个点: 1.基于软件测试框架之上.复习下软件测试框架. 2.框架的内容贯穿于A ...

  10. 09- Linux下压缩和解压命令

    压缩和解压命令 gzip命令: 作用: tar命令 作用:对文件或文件夹进行打包和解包的操作. 格式:tar [选项] 文件名 [文件名或路径] 练习题: