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. Jetpack Compose的Modifier顺序问题

    一:前言 困惑起源于这段代码 Composable.clickable(点击1).clickable(点击2).size(100.dp).size(200.dp){ ............... } ...

  2. Linux 三剑客之sed

    目录 Linux 三剑客之sed 命令补充: sort命令 uniq命令 cut命令 tr命令 wc命令 三剑客 - sed 编辑模式: 定位分类: 实例如下: d模式--删除模式 p模式--打印 a ...

  3. CF1082A Vasya and Book 题解

    Content 给定 \(T\) 组数据,每组数据给出四个整数 \(n,x,y,d\).小 V 有一本 \(n\) 页的书,每次可以恰好翻 \(d\) 页,求从第 \(x\) 页恰好翻到第 \(y\) ...

  4. CF1145F Neat Words 题解

    Content 本题为 CF 愚人节比赛题目. 给定一个长度为 \(n\) 的,仅包含大写字母的字符串,问这个字符串里面的字母是否全部都是由仅有直线的字母组成,或者全部都是由有曲线的字母构成. 数据范 ...

  5. CF140D New Year Contest 题解

    Content 小 G 想打一场跨年比赛,比赛从下午 \(18:00\) 开始一直持续到次日清晨 \(6:00\),一共有 \(n\) 道题目.小 G 在比赛开始之前需要花费 10 分钟考虑这些题目的 ...

  6. 网络路径排查工具使用/原理浅析(MTR、traceroute、tracepath、windows下besttrace)

    在请求网络资源获取缓慢或者有丢包过程中.经常会使用到网络路径探测工具.linux 下最常用的有mtr.traceroute.tracepath 等. 你是否有一点疑惑,路径探测的原理到底是如何完成的, ...

  7. git clone 报错:SSL certificate prob lem: self signed certificate

    先执行: git config --global http.sslVerify false 然后重新执行git clone 命令即可

  8. C语言读写二进制文件

    fseek用法 fseek用来移动文件指针.函数原型 int fseek(FILE * stream, long offset, int fromwhere); 参数解释: stream 是文件流指针 ...

  9. 【LeetCode】155. Min Stack 最小栈 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 栈同时保存当前值和最小值 辅助栈 同步栈 不同步栈 日期 题目地 ...

  10. 【LeetCode】767. Reorganize String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.me/ 题目地址:https://leetcode.com/problems/reorganiz ...