题目:

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。《不同行,不同列,不同对角线》

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

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

样例

对于4皇后问题存在两种解决的方案:

[

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

"...Q",

"Q...",

"..Q."],

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

"Q...",

"...Q",

".Q.."]

]

挑战

你能否不使用递归完成?

解题:

题意:在n*n的棋盘上,保证n个皇后,不同行,不同列,不同对角线,这样的组合方式有多少种,并求出所以的组合方式。

在网上看到下面的思路:

在n*n的矩阵中,n个皇后分别在0-n-1行,也就是说,第i个皇后在第i行是固定的,但是在第多少列?用到回溯法进行解决。

对第i个皇后,依次考虑0 - n-1列的位置是否合法,若在第k列的位置合法,则再考虑下一个皇后的位置。

当i==n的时候并且起位置合法,则保存路径上的各个皇后位置。

如何判断其位置是合法的?

1.暴力,定义矩阵,对新来的点看是否有和它在相同的行,列,对角线

2.定义一个保存所在列的矩阵colVals,其下标就是所在的行,colVals[i]的值就是所在的列值。

显然 不会相同了,只需再考虑列,对角线<正对角线,负对角线>

列值相同:colVals[i] = colVals[row]  ->也就是在相同的列

对角线的时候,可以发现这样的规律:|row - i| = |colVals[row] - colVals[i]| 这里要考虑绝对值,有两种情况的。

其他情况都是合法的。

参考链接
Java程序:

class Solution {
/**
* Get all distinct N-Queen solutions
* @param n: The number of queens
* @return: All distinct solutions
* For example, A string '...Q' shows a queen on forth position
*/
ArrayList<ArrayList<String>> solveNQueens(int n) {
// write your code here
ArrayList<String> path = new ArrayList<String>();
ArrayList<ArrayList<String>> result = new ArrayList<ArrayList<String>>();
if( n<0 )
return result;
int cols[] = new int[n];
DFS_helper(n,result,0,cols);
return result; }
public void DFS_helper(int nQueens,ArrayList<ArrayList<String>> result,int row,int[] cols){
if(row == nQueens ){
ArrayList<String> path = new ArrayList<String>();
for(int i = 0;i<nQueens ;i++){
String s = "";
for(int j = 0;j< nQueens ;j++){
if(j == cols[i])
s = s + "Q";
else
s = s + ".";
}
path.add(s); }
result.add(path);
}else{
for(int i = 0;i<nQueens ;i++){
cols[row] = i;
if(isValid(row,cols))
DFS_helper(nQueens,result,row + 1 ,cols);
}
}
}
public boolean isValid(int row ,int[] cols){
for(int i=0;i<row;i++){
if(cols[row] == cols[i] || Math.abs(cols[row] - cols[i]) == row - i)
return false;
}
return true;
}
};

总耗时: 1397 ms

"这类型问题统称为递归回溯问题,也可以叫做对决策树的深度优先搜索(dfs)"

竟然也叫深度优先搜索。。。

Python程序:

lintcode 中等题:N Queens N皇后问题的更多相关文章

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

    题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...

  2. lintcode 中等题:partition array 数组划分

    题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...

  3. lintcode 中等题:permutations II 重复数据的全排列

    题目 带重复元素的排列 给出一个具有重复数字的列表,找出列表所有不同的排列. 样例 给出列表 [1,2,2],不同的排列有: [ [1,2,2], [2,1,2], [2,2,1] ] 挑战 使用递归 ...

  4. lintcode 中等题:permutations 全排列

    题目 全排列 给定一个数字列表,返回其所有可能的排列. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个列表[1,2,3],其全排列为: [ [1,2,3], [1,3,2], [2,1,3 ...

  5. lintcode 中等题: Implement Trie

    题目 Implement Trie Implement a trie with insert, search, and startsWith methods. 样例   注意 You may assu ...

  6. lintcode 中等题:majority number III主元素III

    题目 主元素 III 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k. 样例 ,返回 3 注意 数组中只有唯一的主元素 挑战 要求时间复杂度为O(n),空间复杂度为O( ...

  7. lintcode 中等题:A + B Problem A + B 问题

    题目: 中等 A + B 问题 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符. 如果 a=1 并且 b=2,返回3 注意 你不需要从输入流读入数据,只需要根据aplusb的两个参数 ...

  8. lintcode 中等题:搜索旋转排序数组II

    题目 搜索旋转排序数组 II 跟进“搜索旋转排序数组”,假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中. 样例 给出[3, ...

  9. lintcode 中等题: reverse linked list II 翻转链表II

    题目 翻转链表 II 翻转链表中第m个节点到第n个节点的部分 样例 给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4-> ...

随机推荐

  1. 关于LINQ一个简单例子

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  2. Bundle、Intent、SharedPreferences

    Intent与Bundle的共同点:都继承Parcelable Intent传值与Bundle传值的区别 eg:我现在要从A界面   跳转到B界面或者C界面   这样的话 我就需要写2个Intent  ...

  3. Ubuntu下PHP开发配置(新增redis、sphinx、sqlserver相关配置)

    由于本人比较懒,所以一般都是用xampp的直接拿来改的…………(当然xampp中一般php版本都是比较新的用的过程中请大家注意哈,可能会和老版本冲突) 此次除了使用xampp外,还扩展了sphinx, ...

  4. PHP流程控制语句下

    ok,继续搞. while循环: while(expr){ 程序块: } 条件expr成立执行程序块,否则结束. do while循环:do while循环比while循环要多循环一次,它要先执行程序 ...

  5. MediaRecorder类介绍

    audiocallbackvideojavadescriptorencoding 目录(?)[+] 找到个MediaRecorder类介绍和大家分享一下. Mediarecorder类在官网的介绍和在 ...

  6. haproxy 安装与配置文件详解

    本文主要阐述haproxy的安装配置详解,对于它的概念,作用,功能,和其它LB软件的区别,优点,缺点等不再进行说明. 一. haproxy 的安装配置 # cat /etc/redhat-releas ...

  7. ArcGIS操作问题

    1.利用分析工具——叠加分析——“空间连接”工具,将完全包含(COMPLETELY_CONTAINS)某点的面的属性值赋为该点的属性值. 其中定义用于匹配行的条件.匹配选项包括: 相交—如果连接要素与 ...

  8. 腾讯WEB前端开发三轮面试经历及面试题

    [一面]~=110分钟  2013/04/24 11:20  星期三 进门静坐30分钟做题. 填空题+大题+问答题 >>填空题何时接触电脑 何时接触前端运算符 字符串处理        延 ...

  9. Entity Framework (二) 查询

    待完善-------------------------------------- ----------- base 关键字用于从派生类中访问基类的成员: 调用基类上已被其他方法重写的方法. 指定创建 ...

  10. 显示 mac 隐藏文件

    显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏Mac隐藏文件的命令:defaults writ ...