[刷题] 51 N-Queens
要求
- 将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的更多相关文章
- 【刷题记录】BZOJ-USACO
接下来要滚去bzoj刷usaco的题目辣=v=在博客记录一下刷题情况,以及存一存代码咯.加油! 1.[bzoj1597][Usaco2008 Mar]土地购买 #include<cstdio&g ...
- LeetCode 刷题指南(1):为什么要刷题
虽然刷题一直饱受诟病,不过不可否认刷题确实能锻炼我们的编程能力,相信每个认真刷题的人都会有体会.现在提供在线编程评测的平台有很多,比较有名的有 hihocoder,LintCode,以及这里我们关注的 ...
- 83.(01背包)CYD刷题
3130 CYD刷题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 下午,CYD要刷题了,已知CY ...
- leetcode 刷题记录(java)-持续更新
最新更新时间 11:22:29 8. String to Integer (atoi) public static int myAtoi(String str) { // 1字符串非空判断 " ...
- LeetCode刷题总结-数组篇(中)
本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...
- C#LeetCode刷题-二叉搜索树
二叉搜索树篇 # 题名 刷题 通过率 难度 220 存在重复元素 III 19.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 327 区间和的个数 29.5% 困难 3 ...
- C#LeetCode刷题-深度优先搜索
深度优先搜索篇 # 题名 刷题 通过率 难度 98 验证二叉搜索树 22.2% 中等 99 恢复二叉搜索树 45.1% 困难 100 相同的树 48.1% 简单 101 对称二叉树 4 ...
- C#LeetCode刷题-树
树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 ...
- C#LeetCode刷题-位运算
位运算篇 # 题名 刷题 通过率 难度 78 子集 67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...
随机推荐
- 如何使用Topshelf与.NET泛型主机建立Windows服务
1 前置阅读 在阅读本文章之前,你可以先阅读: Topshelf一个用于使用.NET构建Windows服务框架 2 使用 2.1 创建应用程序 首先,创建一个新的控制台应用程序并从nuget获取Top ...
- day-03-基础数据类型
基础数类型总览 10203 123 3340 int +- * / 等等 '今天吃了没?' str 存储少量的数据,+ *int 切片, 其他操作方法 True False bool 判断真假 [12 ...
- Dynamics CRM9.0安装CRM的时候提示Microsoft.Crm.Setup.Server.RegisterSandboxServiceAction操作失败
如图: 这种问题有两种情况会遇到.第一种是一个域装多套CRM产品会提示这个问题这个问题是解决不了的. 还一种情况就是安装9.0及以后的产品先安装了ADFS再安装产品就会提示这个错误. 第二种解决办法就 ...
- 【Git基本命令】
[基本指令] git init :使目标文件夹变成一个仓库 git add <文件名,含后缀> : 告诉git我要添加文件了 git commit -m "<提交说明> ...
- 四、python学习-正则表达式
正则表达式 import re lst = re.findall(正则表达式,需要匹配的字符串) findall 把所有匹配到的字符串都搜出来,返回列表 不能把分组内容和匹配内容同时显示出来 sear ...
- django-数据库的增删改查操作
django-数据库的增删改查操作 1.添加用户记录 def login(request): 增加用户记录 使用save()方法来增加记录 username = UserInfo(username=' ...
- 恒骊学堂的JAVA初步学习总纲--转载
- Linux递归压缩图片脚本
1 压缩图片 使用ImageMagick的convert命令进行压缩图片,一般只需要一个指定压缩质量的参数,比如: convert -quality 75 1.jpg 1_compress.jpg 可 ...
- Java面向对象7大设计原则
目录 单一职责原则 SRP 开闭原则 OCP 里氏替换原则 LSP 依赖倒置原则 DIP 接口隔离原则 ISP 组合复用原则 CRP 迪米特法则 LOD 单一职责原则 SRP 一个类只有一个引起修改变 ...
- Mybatis3源码笔记(一)环境搭建
1. 源码下载 地址:https://github.com/mybatis/mybatis-3.git. 国内访问有时确实有点慢,像我就直接先fork.然后从git上同步到国内的gitte上,然后在i ...