#include "000库函数.h"

 //使用回溯法来计算
//经典解法为回溯递归,一层一层的向下扫描,需要用到一个pos数组,
//其中pos[i]表示第i行皇后的位置,初始化为 - 1,然后从第0开始递归,
//每一行都一次遍历各列,判断如果在该位置放置皇后会不会有冲突,以此类推,
//当到最后一行的皇后放好后,一种解法就生成了,将其存入结果res中,
//然后再还会继续完成搜索所有的情况,代码如下:17ms
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>>res;
vector<int>pos(n, -);
NQueue(res, pos, );
return res;
} void NQueue(vector<vector<string>>&res, vector<int>&pos, int t) {
int n = pos.size();
if (t == n) {//组合成功
vector<string>v(n, string(n, '.'));//这初始化绝逼了
for (int i = ; i < n; ++i)
v[i][pos[i]] = 'Q';
res.push_back(v);
}
else
for (int k = ; k < n; ++k)
if (Danger(pos, t, k)) {
pos[t] = k;
NQueue(res, pos, t + );
pos[t] = -;//切记,关键点,回溯
}
} bool Danger(vector<int>pos, int t, int k) {
for (int i = ; i < t; ++i)
if (pos[i] == k || abs(t - i) == abs(pos[i] - k))
return false;
return true;
} }; //通过使用排列进行判断是否可行进行求解
//但是太耗时了,还是用回溯法吧
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>>res;
vector<int>nums;
for (int i = ; i < n; ++i)
nums.push_back(i); if (Danger(nums)) {
vector<string>v;
for (int i = ; i < n; ++i) {
string s = "";
for (int k = ; k < nums[i]; ++k)
s += '.';
s += 'Q';
for (int k = nums[i] + ; k < n; ++k)
s += '.';
v.push_back(s);
}
res.push_back(v);
}
while (next_permutation(nums.begin(), nums.end())) {
if (Danger(nums)) {
vector<string>v;
for (int i = ; i < n; ++i) {
string s = "";
for (int k = ; k < nums[i]; ++k)
s += '.';
s += 'Q';
for (int k = nums[i] + ; k < n; ++k)
s += '.';
v.push_back(s);
}
res.push_back(v);
}
}
return res;
} bool Danger(vector<int>nums) {//用来判断是否可行
for (int i = ; i < nums.size(); ++i) {
for (int j = ; j < nums.size(); ++j) {
if (j == i)continue;
if ((j + nums[j]) == (i + nums[i]) || (i - nums[i]) == (j - nums[j]))
return false;
}
}
return true;
} }; void T051() {
Solution s;
vector<vector<string>>v;
int n;
n = ;
v = s.solveNQueens(n);
for (auto &a : v) {
for (auto b : a)
cout << b << endl;
cout << "//////////////////////////" << endl;
} }

力扣算法题—051N皇后问题的更多相关文章

  1. 力扣算法题—052N皇后问题2

    跟前面的N皇后问题没区别,还更简单 #include "000库函数.h" //使用回溯法 class Solution { public: int totalNQueens(in ...

  2. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  3. 力扣算法题—060第K个排列

    给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...

  4. 力扣算法题—050计算pow(x, n)

    #include "000库函数.h" //使用折半算法 牛逼算法 class Solution { public: double myPow(double x, int n) { ...

  5. 力扣算法题—147Insertion_Sort_List

    Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...

  6. 力扣算法题—093复原IP地址

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135", ...

  7. 力扣算法题—079单词搜索【DFS】

    给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...

  8. 力扣算法题—143ReorderList

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You may not mod ...

  9. 力扣算法题—144Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [1,null,2,3 ...

随机推荐

  1. 【转载】Sqlserver阻止保存要求重新创建表的更改

    在Sqlserver创建完表table后,后续维护过程中有时候需要往表格中新增字段,在表设计窗体中新增字段后保存,有时候会直接抛出错误信息,提示“不允许保存更改,您所做的更改要求删除并重新创建以下表” ...

  2. Intellij idea 项目目录设置 与包的显示创建

    1.把目录设置成为层级结构显示.和eclipse类似 去掉flatten Packages前面的勾 在项目中创建多级包的时候要注意,必须在Java下建,并且要全输入才能识别

  3. 微信开发中网页授权access_token与基础支持的access_token异同 【转载、收藏】

    问题1:网页授权access_token与分享的jssdk中的access_token一样吗? 答:不一样.网页授权access_token 是一次性的,而基础支持的access_token的是有时间 ...

  4. 48.Linux-普通U盘以及多分区U盘自动挂载

    在上章学习33.Linux-实现U盘自动挂载(详解)后,只是讲解了普通U盘挂载,并没有涉及到多分区U盘,接下来本章来继续学习 1.多分区U盘和普通U盘区别 1)U盘插上只会创建一个/dev/sda文件 ...

  5. 【Java每日一题】20170323

    20170322问题解析请点击今日问题下方的“[Java每日一题]20170323”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  6. Ubuntu创建新用户的正确姿势

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<Ubuntu 创建新用户的正确姿势>原文地址.更欢迎来我的小站看更多原创内容:godbmw.com,进行&q ...

  7. Javascript继承4:洁净的继承者----原型式继承

    //原型式继承 function inheritObj(obj){ //声明一个过渡函数对象 function F(){} //过渡对象的原型继承父对象 F.prototype = obj; //返回 ...

  8. spring-framework-中文文档一:IoC容器、介绍Spring IoC容器和bean

    5. IoC容器 5.1介绍Spring IoC容器和bean 5.2容器概述 本章介绍Spring Framework实现控制反转(IoC)[1]原理.IoC也被称为依赖注入(DI).它是一个过程, ...

  9. JavaScript主流框架3月趋势总结

    原文: What’s New in JavaScript Frameworks-March 2018 译者: Fundebug 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅 ...

  10. TS学习随笔(二)->类型推论,联合类型

    这篇内容指南:        -----类型推论  -----联合类型 类型推论 第一篇中我们看了TS的基本使用和基本数据类型的使用,知道了变量在使用的时候都得加一个类型,那我们可不可以不加呢,这个嘛 ...