代码,由全排列转化而来,加上剪枝,整洁的代码:

共有4个变量,res(最终的结果),level,当前合理的解,n皇后的个数,visit,当前列是否放过皇后,由于本来就是在新的行方皇后,又通过visit判定,因此当前的新皇后肯定不在以往的行和列。因此只需要对新加的皇后判断斜对角是否符合要求;

class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
if(n==) return {};
vector<vector<string>> res;
vector<int> visit(n,);
vector<int> level;
dfs(res,level,visit,n);
return res;
}
void dfs(vector<vector<string>>&res,vector<int>&level,vector<int>&visit,int n){
if(level.size()==n){
vector<string> vs(n,string(n,'.'));
for(int i=;i<n;i++){
int j=level[i];
vs[i][j]='Q';
}
res.push_back(vs);
return;
}
for(int j=;j<n;j++){
if(visit[j]== && isvalid(level,j)){
visit[j]=;
level.push_back(j);
dfs(res,level,visit,n);
visit[j]=;
level.pop_back();
}
}
}
bool isvalid(vector<int>&level,int y){
int x=level.size();
for(int i=;i<x;i++){
int j=level[i];
if(abs(y-j)==x-i)
return false;
}
return true;
}
};

其实就是全排列问题+剪枝,也是很经典很经典

代码:

class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
vector<int> pos(n,-);//记录第i+1行的皇后,应该放在第j+1列
int row=;
DFS(n,row,pos,res);
return res;
}
void DFS(int n,int row,vector<int>& pos,vector<vector<string>>& res){
//回溯法,能到下一条语句一定合法
//递归边界1,得到最终的解;
if(row==n){
vector<string> temp(n,string(n,'.'));
for(int i=;i<n;i++){
temp[i][pos[i]]='Q';
}
res.push_back(temp);
}else{
for(int col=;col<n;col++){
//新加皇后到row+1行,col+1列合法,进入子问题;如果新皇后怎么加都无效,则本次循环结束,col+1进行下一次循环
//判断是否需要向子问题递归,不需要则返回上一层;
if(isvalid(pos,row,col)){
pos[row]=col;
DFS(n,row+,pos,res);
pos[row]=-;
}
}
} }
bool isvalid(vector<int>& pos,int row,int col){
//判断是否放在了已经有皇后的列上,以及是否在同一对角线上;
for(int i=;i<row;i++){
if((col==pos[i])||(abs(row-i)==abs(col-pos[i])))
return false;
}
return true;
}
};

leetcode 51 N皇后问题的更多相关文章

  1. Java实现 LeetCode 51 N皇后

    51. N皇后 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决 ...

  2. leetcode 51. N皇后 及 52.N皇后 II

    51. N皇后 问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后 ...

  3. [leetcode]51. N-QueensN皇后

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  4. LeetCode 51. N-QueensN皇后 (C++)(八皇后问题)

    题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two que ...

  5. Leetcode之回溯法专题-51. N皇后(N-Queens)

    Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...

  6. [LeetCode] 51. N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  7. [LeetCode] N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  8. LeetCode: 51. N-Queens(Medium)

    1. 原题链接 https://leetcode.com/problems/n-queens/description/ 2. 题目要求 游戏规则:当两个皇后位于同一条线上时(同一列.同一行.同一45度 ...

  9. Java实现 LeetCode 52 N皇后 II

    52. N皇后 II n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回 n 皇后不同的解决方案 ...

随机推荐

  1. js 重要函数

    1. Array.some some() 方法用于检测数组中的元素是否满足指定条件(函数提供) 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测.如果没有满足条件的元素,则返 ...

  2. 使用ELK进行日志分析

    0x01 前言: 前段时间做应急,总是需要溯源分析,痛点是数据量比较大,想要短时间能分析出来.再者就是之前在调查某酒店事件的时候特别羡慕某产商有各种分析溯源工具.反思过后,终于在没有那么忙的时候开始搭 ...

  3. Ubuntu与centos的区别小用法

    给root设置密码 更新软件下载的地址 安装指令apt 使用ssh登录Ubuntu 使用ssh登录Ubuntu必须注意的地方,要先配置 sudo vi /etc/ssh/sshd_config 找到: ...

  4. 为什么wamp 放两个网站 或者多个网站就很卡很慢,问题在这里

    PHP的配置比较简单,只需要进行一些基本设置的修改就可以了,依次点击—PHP—php.ini,找到这三个地方:short_open_tag = Off(是否允许使用 PHP 代码开始标志的缩写形式(& ...

  5. 免费数学神器Mathpix发布移动版了,一起来写更快的公式

    目录 1. 按 2. 下载地址 3. 介绍和使用 3.1. 介绍 3.2. 实际使用体验 1. 按 本文介绍的Mathpix可用于将手写的公式通过拍照或截图转成LaTeX 表达式. 写博客.记笔记最麻 ...

  6. Inception网络模型

    最近在研究inception模型,将v1到v4版本的论文都研读了一下,这里做一下总结. 这里推荐一下这个GitHub,博主将常见的论文都做了翻译,大家可以参考中文来加深理解. 1.Inception ...

  7. 1.(基础)tornado初识

    tornado的话就不带着大家看源码了,今后可能会介绍,目前只是看简单的用法,而且当前的tornado版本不高,其实说白了这是很久以前写的文档,但是由于格式的原因,所以打算用Markdown重写一次. ...

  8. shell中字符串操作【转】

    转自:http://blog.chinaunix.net/uid-29091195-id-3974751.html 我们所遇到的编程语言中(汇编除外)都少不了字符串处理函数吧,当然shell编程也不例 ...

  9. django笔记一

    课程介绍 MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 m表示model,主要用于对数据库层的封 ...

  10. javascript模板字符串(反引号)

    模板字面量 是允许嵌入表达式的字符串字面量. 你可以使用多行字符串和字符串插值功能.它们在ES2015规范的先前版本中被称为“模板字符串”. 语法 `string text`​`string text ...