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. 筛选Table.SelectRows-日期与时间(Power Query 之 M 语言)

    数据源: 包含日期与时间的任意数据 目标: 对日期与时间进行筛选 M公式: = Table.SelectRows( 表,筛选条件) 筛选条件: 等于:each [日期列] = #date(年,月,日) ...

  2. CentOS7下使用NFS文件共享给Window server 2012

    CentOS7下使用NFS文件共享给Window server 2012 2018年08月24日 23:15:54 疼迅扣扣 阅读数:443  出自https://blog.csdn.net/u013 ...

  3. Chrome的强大搜索功能

    前言 前几天一个好朋友求助我,大概问题是他的电脑QQ啥都能上网,就浏览器上不了网不是IE而是chrome,我第一反应可能是dns问题.后来发甩过来一张图,好家伙把我吓得,类似于下面这张图 这图是我自己 ...

  4. 优化vue+springboot项目页面响应时间:waiting(TTFB) 及content Download

    优化vue+springboot项目页面响应时间:waiting(TTFB) 及content Download TTFB全称Time To First Byte,是指网络请求被发起到从服务器接收到地 ...

  5. [转]详细ADB使用大全

    原文链接:https://github.com/mzlogin/awesome-adb ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也 ...

  6. 【LeetCode】1460. 通过翻转子数组使两个数组相等 Make Two Arrays Equal by Reversing Sub-arrays (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 判断排序后是否相等 统计字符出现次数 日期 题目地址: ...

  7. 1275 - Internet Service Providers

    1275 - Internet Service Providers    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory L ...

  8. AOP 日志切面

    AOP把软件的功能模块分为两个部分:核心关注点和横切关注点.业务处理的主要功能为核心关注点,而非核心.需要拓展的功能为横切关注点.AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点进行分 ...

  9. uniapp动态修改导航栏

    1.修改导航栏buttons 如图动态修改角标 <template> <view> </view> </template> <script> ...

  10. MySQL高级查询与编程笔记 • 【第5章 常见数据库对象】

    全部章节   >>>> 本章目录 5.1 视图 5.1.1 视图的定义 5.1.2 视图的优点 5.1.3 视图的创建和使用 5.1.4 利用视图解决数据库的复杂应用 5.1. ...