要求

  • 将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. jd的艺术

    我看最近的狗东的ldz很火哈.所以我也来凑个热闹发个教程. 准备工作 1.一台openwrt系统设备 2.一个脑子 3.一双手 话不多说,开始吧! 步骤 一.链接N1(你的设备) 这里需要一款ssh工 ...

  2. SQL语句练习(进阶版)

    学生数据库中有三个基本表(关系)如下: 学生表S(Sno,Sname,Age,Sex,SD) 课程表C(Cno,Cname, Teacher) 选课表SC(Sno,Cno,Grade) 请用SQL语言 ...

  3. 前端开发面试题 — css篇

    1.介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有两种, IE 盒子模型.W3C 盒子模型: (2)盒模型: 内容(content).填充(padding).边界(mar ...

  4. JavaWeb 补充(JSP&EL&JSTL)

    1. JSP:     1. 指令     2. 注释     3. 内置对象 2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构 JSP: 1. 指令     * 作用:用于 ...

  5. 又一起.NET程序挂死, 用 Windbg 抽丝剥茧式的真实案例分析

    一:背景 1. 讲故事 前天有位粉丝朋友在后台留言让我帮忙看看他的 Winform程序 UI无响应 + 410线程 到底是啥情况,如下图: 说实话,能看到这些真实案例我是特别喜欢的 ,就像医生看病,光 ...

  6. Spring Cloud Gateway 全局通用异常处理

    为什么需要全局异常处理 在传统 Spring Boot 应用中, 我们 @ControllerAdvice 来处理全局的异常,进行统一包装返回 // 摘至 spring cloud alibaba c ...

  7. 鹏城杯_2018_treasure

    鹏城杯_2018_treasure 首先检查一下保护: IDA分析 我们先来看看settreasure()函数 申请了两个内存空间,并往sea中复制了shellcode 看看这个shellcode,不 ...

  8. 04.ElementUI源码学习:组件封装、说明文档的编写发布

    0x00.前言 书接上文.项目经过一系列的配置,开发脚手架已经搭建完毕.接下来开始封装自定义组件.并基于 markdown 文件生成文档和演示案例. 后续文章代码会根据篇幅,不影响理解的情况下进行部分 ...

  9. Django 入门范例

    1. Django 介绍 2. Django 环境搭建 3. 模型(Model) 4. 站点管理 5. 视图(View) 6. 模板(Template) 1. Django 介绍 MVC 模型 大部分 ...

  10. 粗浅聊聊Python装饰器

    浅析装饰器 通常情况下,给一个对象添加新功能有三种方式: 直接给对象所属的类添加方法: 使用组合:(在新类中创建原有类的对象,重复利用已有类的功能) 使用继承:(可以使用现有类的,无需重复编写原有类进 ...