LeetCode51 N-Queens

题目:

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

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens‘ placement, where ‘Q‘ and ‘.‘ both indicate a queen and an empty space respectively. (Hard)

For example,
There exist two distinct solutions to the 4-queens puzzle:

[
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]

分析:

n皇后问题,典型的搜索思路,对每一行,依次遍历选择一个位置,添加一个Q进去,判断是否合法。合法则处理下一行,不合法则回退到上一行选择其他位置添加Q。

注意isVaild函数的写法,行在添加过程中保证不重复,列需要判断,主副对角线通过x + y为定值和 x - y为定值判断(注意均只需要判断x,y之前的即添加过的部分)。

代码:

 1 class Solution {
 2 private:
 3     vector<vector<string>> result;
 4     void helper(vector<string>& v, int row, int n) {
 5         for (int i = 0; i < n; ++i) {
 6             v[row][i] = ‘Q‘;
 7             if (isValid(v, row, i, n)) {
 8                 if (row == n - 1) {
 9                     result.push_back(v);
10                     v[row][i] = ‘.‘;
11                     return;
12                 }
13                 helper(v, row + 1, n);
14             }
15             v[row][i] = ‘.‘;
16         }
17     }
18     bool isValid (const vector<string>& v, int x, int y, int n) {
19         for (int i = 0; i < x; ++i) {
20             if (v[i][y] == ‘Q‘) {
21                 return false;
22             }
23         }
24         for(int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--,j--) {
25             if(v[i][j] == ‘Q‘) {
26                 return false;
27             }
28         }
29         for(int i = x - 1, j = y + 1; i >= 0 && j < n; i--,j++){
30             if(v[i][j] == ‘Q‘) {
31                 return false;
32             }
33         }
34         return true;
35     }
36 public:
37     vector<vector<string>> solveNQueens(int n) {
38         vector<string> v(n, string(n, ‘.‘));
39         helper(v,0,n);
40         return result;
41     }
42 };
时间: 2024-12-22 08:15:20

LeetCode51 N-Queens的相关文章

lintcode 中等题:N Queens N皇后问题

题目: N皇后问题 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击.<不同行,不同列,不同对角线> 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置. 样例 对于4皇后问题存在两种解决的方案: [ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], [&qu

Python----递归------Eight Queens 八皇后问题

递归思想是算法编程中的重要思想. 作为初学者,对递归编程表示很蒙逼,每次遇到需要递归的问题,心里就有一万头草泥马飞过~~~~~~(此处略去一万头草泥马) 在B站看数据结构与算法的视频时,视频中给了两个非常典型的例子--<汉诺塔>和<八皇后问题>,就希望自己用Python实现一下这两个递归程序,其中汉诺塔问题比较简单,还是能够理解,这里就不讲了. <八皇后问题>:说要在一个棋盘上放置8个皇后,但是不能发生战争,皇后们都小心眼,都爱争风吃醋,如果有人和自己在一条线上(水平.

lintcode 中等题:N Queens II N皇后问题 II

题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递归的时候才能保存结果,参考程序 java程序: class Solution { /** * Calculate the total number of distinct N-Queen solutions. * @param n: The number of queens. * @return:

051 N Queens

此题即在 052 N Queens 2 基础上稍作改进 并注意返回格式就好 import copy class Solution: def __init__(self): self.ans = [] # @param {integer} n # @return {integer} def solveNQueens(self, n): self.helper(0,[["."]* n for i in range(0,n)],n) return self.ans def helper(se

Sicily 1172. Queens, Knights and Pawns

Constraints Time Limit: 1 secs, Memory Limit: 64 MB Description You all are familiar with the famous 8-queens problem which asks you to place 8 queens on a chess board so no two attack each other. In this problem, you will be given locations of queen

54. 八皇后问题[eight queens puzzle]

[本文链接] http://www.cnblogs.com/hellogiser/p/eight-queens-puzzle.html [题目] 在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法. [分析] 之前博文28.字符串的排列[StringPermutation]介绍过字符串的全排列,八皇后问题也可以转换为全排列问题. 由于八个皇后的任意两个不

poj3239 Solution to the n Queens Puzzle (n皇后问题)

Solution to the n Queens Puzzle Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3494   Accepted: 1285   Special Judge Description The eight queens puzzle is the problem of putting eight chess queens on an 8 × 8 chessboard such that none

[Leetcode] n queens n皇后问题

The n-queens puzzle is the problem of placing n queens on an n×nchessboard such that no two queens attack each other. Given an integer n, return all distinct solutions to the n-queens puzzle. Each solution contains a distinct board configuration of t

SGU 224.Little Queens

时间限制:0.75s 空间限制:6M 题意 n*n(n<=10)的棋盘,求出放置m(m<=n*n)个皇后的方案数. Solution: 状态压缩+位运算  搜索. 首先我们从上往下逐行放置, DFS(line, row, l, r, k) line :当前行号 row:列状态 l:\ 左上对角线状态 r:/右上对角线状态 k:已放置棋子数 对于每一行有不放或者放一个棋子两种方案 放一个棋子时又要考虑哪些位置可以放置, 状态压缩(row,r,l): 例如当n=4时 二进制数 1=(0001)2代