要求

  • 将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. 洛谷P1290欧几里德游戏

    题目地址 题目大意: 两个人st和ol博弈 有两个整数n,m 每次轮到一个人时候,需要选择用大的那个数减去小的那个数的倍数(不能减为负数) 最后得到0的为胜利者 思路: (以下讨论均在n<m的条 ...

  2. 第21 章 : Kubernetes 存储架构及插件使用

    Kubernetes 存储架构及插件使用 本文将主要分享以下三方面的内容: Kubernetes 存储体系架构: Flexvolume 介绍及使用: CSI 介绍及使用. Kubernetes 存储体 ...

  3. 基于阿里云托管kubernetes的版本升级

    前言 因为阿里云的knative对应得k8s版本大于1.15,而我们目前得集群环境是1.14.8,因此需要对预发环境进行版本升级.基于aliyun托管的kubernetes集群版本升级本没有什么可写, ...

  4. 简单创建ASP.NET网站(1)

    闲话 公司员工辞职了,我从原来的Delphi开发转型到ASP.NET开发,接受同时的相关工作,因为网上搜了视频学习,还是不觉得有什么提升,一脸懵逼,所以就买了书籍自己慢慢学习,为了加深记忆,我就记录一 ...

  5. OO UNIT 2 个人总结

    第二单元面向对象作业--性感电梯在线吃人 Part 1:单部可捎带电梯 多线程设计策略 本次电梯仅仅只有一部运行,因此,在多线程的设计中难度不大,并且,只需采用一对一的生产者-消费者模型即可解决问题. ...

  6. Spring(七篇)

    (一)Spring 概述 (二)Spring Bean入门介绍 (三)Spring Bean继续入门 (四)Spring Bean注入方试 (五)Spring AOP简述 (六)Spring AOP切 ...

  7. Centos下搭建LAMP+PHP

    Centos下搭建LAMP+PHP LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写: Linux,操作系统 Apache,网页服务器 MariaDB或MySQL,数据库管 ...

  8. day19.进程通信与线程1

    1 进程Queue介绍 1 进程间数据隔离,两个进程进行通信,借助于Queue 2 进程间通信:IPC -借助于Queue实现进程间通信 -借助于文件 -借助于数据库 -借助于消息队列:rabbitm ...

  9. JDBC_08_解决SQL注入问题 (登录和注册)

    解决SQL注入问题 只要用户提供的信息不参与sql语句的编译过程,那么尽管用户输入的信息中含有sql关键字那么也不会起作用了 要想使用户提供信息不参与sql语句的编译过程,那么必须使用 java.sq ...

  10. Day07_38_集合中的remove()方法

    集合中的remove()方法 remove() 移除集合中的一个指定对象 代码实例 package com.shige.Collection; import java.util.ArrayList; ...