51. N皇后

问题描述

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."], ["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

问题分析

当在棋盘上放置了一个皇后后,立即排除当前行,列和对应的两个对角线。即:

代码

class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<string> path(n,string(n,'.'));
vector<vector<string>> ans;
backtrack(n,0,ans,path);
return ans;
}
void backtrack(int n,int row,vector<vector<string>> &ans,vector<string> &path)
{
if(row == n)
{
ans.push_back(path);
return;
}
for(int i = 0; i < n; ++i)
{
if(checkvaild(n,row,i,ans,path))
{
path[row][i] = 'Q';
backtrack(n,row+1,ans,path);
path[row][i] = '.';
}
}
}
bool checkvaild(int n,int row,int col,vector<vector<string>> &ans,vector<string> &path)
{
int i,j;
for(i = 0; i < row; i++)
{
if(path[i][col] == 'Q')return false;
}
for(i = row - 1,j = col - 1;i>=0&&j>=0;--i,--j)
{
if(path[i][j] == 'Q')return false;
}
for(i = row - 1,j = col + 1;i>=0&&j<n;--i,++j)
{
if(path[i][j] == 'Q')return false;
}
return true;
}
};

结果:

执行用时 :12 ms, 在所有 C++ 提交中击败了62.59%的用户
内存消耗 :9.5 MB, 在所有 C++ 提交中击败了100.00%的用户

52.N皇后 II

问题描述

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回 n 皇后不同的解决方案的数量。

示例:

输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],  ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

代码

class Solution {
public:
int totalNQueens(int n) {
vector<string> path(n,string(n,'.'));
int num = 0;
backtrack(n,0,path,num);
return num;
}
void backtrack(int n,int row,vector<string> &path,int& num)
{
if(row == n)
{
++num;
return;
}
for(int i = 0; i < n; ++i)
{
if(checkvaild(n,row,i,path))
{
path[row][i] = 'Q';
backtrack(n,row+1,path,num);
path[row][i] = '.';
}
}
}
bool checkvaild(int n,int row,int col,vector<string> &path)
{
int i,j;
for(i = 0; i < row; i++)
{
if(path[i][col] == 'Q')return false;
}
for(i = row - 1,j = col - 1;i>=0&&j>=0;--i,--j)
{
if(path[i][j] == 'Q')return false;
}
for(i = row - 1,j = col + 1;i>=0&&j<n;--i,++j)
{
if(path[i][j] == 'Q')return false;
}
return true;
}
};

结果:

执行用时 :4 ms, 在所有 C++ 提交中击败了89.95%的用户
内存消耗 :8.5 MB, 在所有 C++ 提交中击败了30.71%的用户

参考链接

leetcode 51. N皇后 及 52.N皇后 II的更多相关文章

  1. Leetcode之回溯法专题-52. N皇后 II(N-Queens II)

    Leetcode之回溯法专题-52. N皇后 II(N-Queens II) 与51题的代码80%一样,只不过52要求解的数量,51求具体解,点击进入51 class Solution { int a ...

  2. Java实现 LeetCode 52 N皇后 II

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

  3. LeetCode(52) N-Queens II

    题目 Follow up for N-Queens problem. Now, instead outputting board configurations, return the total nu ...

  4. n皇后问题与2n皇后问题

    n皇后问题 问题描述: 如何能够在 n×n 的棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后 (任两个皇后都不能处于同一条横行.纵行或斜线上) 结题思路: 可采用深度优先算法,将棋盘看成 ...

  5. 蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题

    在学习2n皇后之前,我们应该认识一下n皇后问题: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于 ...

  6. dfs-1756:八皇后及1700:八皇后问题

    总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被 ...

  7. Leetcode 137. 只出现一次的数字 II - 题解

    Leetcode 137. 只出现一次的数字 II - 题解 137. Single Number II 在线提交: https://leetcode.com/problems/single-numb ...

  8. [Leetcode 90]求含有重复数的子集 Subset II

    [题目] Given a collection of integers that might contain duplicates, nums, return all possible subsets ...

  9. Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted)

    Leetcode之二分法专题-167. 两数之和 II - 输入有序数组(Two Sum II - Input array is sorted) 给定一个已按照升序排列 的有序数组,找到两个数使得它们 ...

随机推荐

  1. java 编程基础 Class对象 反射:代理模式和静态代理

    生活中的代理 类(对象)代理模式 代理模式是面向对象编程中比较常见的设计模式. 1. 用户只关心接口功能,而不在乎谁提供了功能.上图中接口是 Subject 2. 接口真正实现者是上图的 RealSu ...

  2. 不同机房vpc使用openswan打通内网

    1.测试环境: 北京6云主机:120.92.51.75/10.0.3.13     VPC:10.0.0.0/16 Ren-test 上海2云主机:42.157.163.120/192.168.3.3 ...

  3. 10分钟uniapp实现即时通讯,腾讯云IM的正确打开方式get

    官方的demo基本上覆盖了所有功能点 今天在使用uniapp开发即时通讯IM的时候遇到了瓶颈,便在uniapp的插件市场搜寻一波看看有没有成熟的轮子借鉴,终于发现了这个宝藏插件--"智密 - ...

  4. 自动化中不能犯的4个RPA错误-RPA学习天地

    自动化在客户支持中的使用预计在未来几年会加速. 根据Dimension Research的数据,2022年72%的客户互动将通过机器人流程自动化(RPA)等新兴技术进行.电话互动将从41%下降到12% ...

  5. c++之别让异常逃离析构函数

    关于 本文代码演示环境: VS2017. 代码写的够不规范,目的是为了缩短文章篇幅. 本文主要是为了加深印象,写了好多次的代码,还是忘记了这茬.... 之前上传到github的代码会慢慢改过来. 本文 ...

  6. 【九度OJ】题目1194:八进制 解题报告

    [九度OJ]题目1194:八进制 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1194 题目描述: 输入一个整数,将其转换 ...

  7. 【LeetCode】336. Palindrome Pairs 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 HashTable 相似题目 参考资料 日期 题目地 ...

  8. Game(hdu5218)

    Game  Accepts: 138  Submissions: 358  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 131072/1 ...

  9. libecc:一个可移植的椭圆曲线密码学库

    libecc:一个可移植的椭圆曲线密码学库 这段时间要写毕设关于椭圆曲线的部分,就参考了一个椭圆曲线库的代码来编写.这个库中的代码的结构.风格和封装在我看来是十分完善的.用起来也比较方便,当作一个密码 ...

  10. 动态规划题 HDU-1024

    http://acm.hdu.edu.cn/showproblem.php?pid=1024 Now I think you have got an AC in Ignatius.L's " ...