lintcode 中等题:N Queens N皇后问题
题目:
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皇后问题的更多相关文章
- lintcode 中等题:N Queens II N皇后问题 II
题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...
- lintcode 中等题:partition array 数组划分
题目 数组划分 给出一个整数数组nums和一个整数k.划分数组(即移动数组nums中的元素),使得: 所有小于k的元素移到左边 所有大于等于k的元素移到右边 返回数组划分的位置,即数组中第一个位置i, ...
- lintcode 中等题:permutations II 重复数据的全排列
题目 带重复元素的排列 给出一个具有重复数字的列表,找出列表所有不同的排列. 样例 给出列表 [1,2,2],不同的排列有: [ [1,2,2], [2,1,2], [2,2,1] ] 挑战 使用递归 ...
- lintcode 中等题:permutations 全排列
题目 全排列 给定一个数字列表,返回其所有可能的排列. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个列表[1,2,3],其全排列为: [ [1,2,3], [1,3,2], [2,1,3 ...
- lintcode 中等题: Implement Trie
题目 Implement Trie Implement a trie with insert, search, and startsWith methods. 样例 注意 You may assu ...
- lintcode 中等题:majority number III主元素III
题目 主元素 III 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k. 样例 ,返回 3 注意 数组中只有唯一的主元素 挑战 要求时间复杂度为O(n),空间复杂度为O( ...
- lintcode 中等题:A + B Problem A + B 问题
题目: 中等 A + B 问题 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符. 如果 a=1 并且 b=2,返回3 注意 你不需要从输入流读入数据,只需要根据aplusb的两个参数 ...
- lintcode 中等题:搜索旋转排序数组II
题目 搜索旋转排序数组 II 跟进“搜索旋转排序数组”,假如有重复元素又将如何? 是否会影响运行时间复杂度? 如何影响? 为何会影响? 写出一个函数判断给定的目标值是否出现在数组中. 样例 给出[3, ...
- lintcode 中等题: reverse linked list II 翻转链表II
题目 翻转链表 II 翻转链表中第m个节点到第n个节点的部分 样例 给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4-> ...
随机推荐
- Spring MVC与easyui国际化
1.建立资源文件 在webapp下建立文件夹language,在其中再添加file,命名分别为language.properties,language_en.properties,language_z ...
- IE8浏览器跨域接口访问异常的解决办法
IE8版本以下浏览器绝对是一个神奇的存在,忙碌好久,万事具备,居然在ajax调用接口的时候直接爆炸 陈述一下问题 首先是有这样一个接口,请求类型POST,入参JSON,出参JSON,jQuery aj ...
- DataGridView导入导出excel
DataGridView导出到Excel #region 方法一 DateGridView导出到csv格式的Excel /// <summary> /// 导出数据到Excel.常用方法, ...
- [大牛翻译系列]Hadoop(7)MapReduce:抽样(Sampling)
4.3 抽样(Sampling) 用基于MapReduce的程序来处理TB级的数据集,要花费的时间可能是数以小时计.仅仅是优化代码是很难达到良好的效果. 在开发和调试代码的时候,没有必要处理整个数据集 ...
- 每日一“酷”之string
介绍:string模块可以追溯到最早的Python版本中.现在很多的被移植为str和unicode对象的方法,在python3.0中会被完全去除.string模块中,有很多有用的常量和累,用来处理st ...
- 通过Linux命令过滤出binlog中完整的SQL语句
DB:5.6.16CentOS:CentOS release 6.3 (Final) 当insert语句通过空格跨行输入的时候,如何提取完整的insert语句! 创建一个空表:mysql> cr ...
- using System.Threading.Tasks;
using System.Threading.Tasks; .Net并行库介绍——Task1
- Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'(using password: YSE)
安装mysql后,使用命令登录mysql居然报错了,Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'(using ...
- 团队项目之NABC
Time:2013-10-22 Author:wang 一个成功的人,总是知道如何管理自己的时间,如何让自己的时间得到最充分最有效的利用.对学生一族而言,课业负担重,各种课程.各种活动.各种社团,如果 ...
- 编译时和运行时、OC中对象的动态编译机制
编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...