力扣算法题—051N皇后问题
#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皇后问题的更多相关文章
- 力扣算法题—052N皇后问题2
跟前面的N皇后问题没区别,还更简单 #include "000库函数.h" //使用回溯法 class Solution { public: int totalNQueens(in ...
- 力扣算法题—069x的平方根
实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...
- 力扣算法题—060第K个排列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...
- 力扣算法题—050计算pow(x, n)
#include "000库函数.h" //使用折半算法 牛逼算法 class Solution { public: double myPow(double x, int n) { ...
- 力扣算法题—147Insertion_Sort_List
Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...
- 力扣算法题—093复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135", ...
- 力扣算法题—079单词搜索【DFS】
给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. ...
- 力扣算法题—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 ...
- 力扣算法题—144Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [1,null,2,3 ...
随机推荐
- 更新计算机名称后TFS文件无法迁出
本人最新刚刚最新了一下计算机名称,但在迁出TFS文件时报如下错误: 如果最近已重命名此计算机,则可通过运行“tf workspaces /updateComputerName:oldComputerN ...
- Java集合类源码解析:AbstractMap
目录 引言 源码解析 抽象函数entrySet() 两个集合视图 操作方法 两个子类 参考: 引言 今天学习一个Java集合的一个抽象类 AbstractMap ,AbstractMap 是Map接口 ...
- JSJ——java基本概念一
Java曾以什么优点吸引你走上程序员这条不归路? 友好的语法.面向对象.内存管理和最棒的跨平台可移植性.write-once/run-anywhere 当然,只有我们真正投身入java才发现有bug要 ...
- mybatis笔记01
目录 1. Mybatis的介绍 2. 使用JDBC编码的分析 2.1 准备 2.3 程序代码 2.4 JDBC问题 3. Mybatis架构 4. Mybatis入门程序 4.1 mybatis下载 ...
- Hibernate入门(五)---------事务管理
在Hibernate中,可以通过代码来操作管理事务,如通过“Transaction tx = session.beginTransaction()”,开启一个事务,持久化操作后,通过"tx. ...
- Spring IOC/DI
IOC:反转控制(资源获取),之前开发是要什么就 new 什么,现在只需创建 IOC 容器,你要什么 IOC 都会给你,你只管接收.反转控制的对象是 Bean,也就是对象 DI:依赖注入,依赖容器把资 ...
- 自动排版工具——XML自动排版生成工具
——支持全球化/多语言/符合W3C标准的XML自动排版工具 Boxth XML/XSL Formatter是专为XML数据或其他结构化数据源自动输出排版文件(如: PDF等)而设计的集数据格式化.版式 ...
- Spring的原理性总结
一.Bean的生命过程 Bean的生命过程可以借鉴Servlet的生命过程,了解其生命过程对于不管是思想还是以后的使用都很有帮助: Bean可以通过两种方式进行加载,分别是使用BeanFactory ...
- Linux Linux下最大文件描述符设置
Linux下最大文件描述符设置 by:授客 QQ:1033553122 1. 系统可打开最大文件描述符设置 查看系统可打开最大文件描述符 # cat /proc/sys/fs/file-max 6 ...
- Android为TV端助力 Service 两种启动方式的区别
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务.这两个方法都 可以启动Service,但是它们的使用场合有所不同.使 ...