N-Queens(N皇后问题)
题目:
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.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."], ["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
题解:
这道题很经典,网上有很多讲解实例。
在国际象棋中,皇后最强大,可以横竖斜的走。所以检查是否冲突就是不要同一行、一列和同一斜线上(行的差和列的差值的绝对值相等)
用一个循环递归处理子问题。这个问题中,在每一层递归函数中,我们用一个循环把一个皇后填入对应行的某一列中,如果当前棋盘合法,我们就递归处理先一行,找到正确的棋盘我们就存储到结果集里面。
这种题目都是使用这个套路,就是用一个循环去枚举当前所有情况,然后把元素加入,递归,再把元素移除,这道题目中不用移除的原因是我们用一个一维数组去存皇后在对应行的哪一列,因为一行只能有一个皇后,如果二维数组,那么就需要把那一行那一列在递归结束后设回没有皇后,所以道理是一样的。
这道题最后一个细节就是怎么实现检查当前棋盘合法性的问题,因为除了刚加进来的那个皇后,前面都是合法的,我们只需要检查当前行和前面行是否冲突即可。检查是否同列很简单,检查对角线就是行的差和列的差的绝对值不要相等就可以。
经典的DFS递归回溯解法,大体思路就是对每一行,按每一列挨个去试,试到了就保存结果没试到就回溯。
难点大概就是用1个一维数组存皇后所在的坐标值。对于一个棋盘来说,每个点都有横纵坐标,用横纵坐标可以表示一个点。
而这道题巧就巧在,每一行只能有一个皇后,也就是说,对于一行只能有一个纵坐标值,所以用1维数组能提前帮助解决皇后不能在同一行的问题。
那么用一维数组表示的话,方法是:一维数组的下标表示横坐标(哪一行),而数组的值表示纵坐标(哪一列)。
见代码:
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> res=new ArrayList<List<String>>();
helper(n,0,new int[n],res);
return res;
}
/*从第一行开始一次给每一行添加皇后。 row:给当前行添加皇后
colForRow:这个数组下标表示行,值表示该行对应的列的位置,这个行列表示皇后的位置。因为在该数组中,行下标只能对应一个值,所以一行只能一个元素,不用再判断两个皇后是不是在同一行了。
因为用一维数组表示,就不用检查是否同行了,对于同列的判断,只要两个行下标对应的值相同,就是在一列。对于斜线,行的差和列的差对应的绝对值是否相等
*/
public void helper(int n,int row,int[] colForRow,List<List<String>> res){
if(n==row){//所有行遍历结束
List<String> list=new ArrayList<>();
for(int i=0;i<n;i++){
StringBuilder sb=new StringBuilder();
for(int j=0;j<n;j++){
if(colForRow[i]==j)
sb.append("Q");
else
sb.append(".");
}
list.add(sb.toString());
}
res.add(list);
return ;
} for(int j=0;j<n;j++){//遍历n列
colForRow[row]=j;//先将皇后放在该行的j位置。
if(check(row,colForRow)){//如果该位置可以放,就递归。如果不让放,进行下一轮循环,j会重新取值。
helper(n,row+1,colForRow,res);
}
//回溯回来以后不用删除上一次的值,因为下一轮循环会覆盖该位置的值
} } private boolean check(int row,int[] colForRow){
//因为是从第一行开始添加的,所以row后面没有皇后。
for(int i=0;i<row;i++){
if(colForRow[i]==colForRow[row]||Math.abs(colForRow[i]-colForRow[row])==row-i)
return false;
}
return true;
}
}
N-Queens(N皇后问题)的更多相关文章
- [CareerCup] 9.9 Eight Queens 八皇后问题
9.9 Write an algorithm to print all ways of arranging eight queens on an 8x8 chess board so that non ...
- lintcode 中等题:N Queens N皇后问题
题目: N皇后问题 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击.<不同行,不同列,不同对角线> 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案 ...
- Python----递归------Eight Queens 八皇后问题
递归思想是算法编程中的重要思想. 作为初学者,对递归编程表示很蒙逼,每次遇到需要递归的问题,心里就有一万头草泥马飞过~~~~~~(此处略去一万头草泥马) 在B站看数据结构与算法的视频时,视频中给了两个 ...
- Aizu - ALDS1_13_A-8 Queens Problem-八皇后的路径输出
The goal of Queens Problem is to put eight queens on a chess-board such that none of them threatens ...
- 经典算法问题的java实现 (二)
原文地址: http://liuqing-2010-07.iteye.com/blog/1403190 1.数值转换(System Conversion) 1.1 r进制数 数N的r进制可以表 ...
- 4专题总结-图论和DFS、BFS
1图论: 1.1 133. Clone Graph https://leetcode.com/problems/clone-graph/#/description 思路:这题可以对照拷贝随机链表那道 ...
- lintcode 中等题:N Queens II N皇后问题 II
题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...
- [Leetcode] n queens ii n皇后问题
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- Jeff Somers's N Queens Solutions 最快的n皇后算法
/* Jeff Somers * * Copyright (c) 2002 * * jsomers@alumni.williams.edu * or * allagash98@yahoo.com * ...
- 54. 八皇后问题[eight queens puzzle]
[本文链接] http://www.cnblogs.com/hellogiser/p/eight-queens-puzzle.html [题目] 在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即 ...
随机推荐
- 学习TensorFlow,多层卷积神经网络
一.网络结构 二.代码 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_ ...
- Android回调事件传播-android学习之旅(四十五)
概念简介 代码演示 package peng.liu.test; import android.app.ActionBar; import android.app.Activity; import a ...
- OpenCV计算物体的重心坐标(2值图像)
效果图: 代码: // FindGravity.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- UNIX环境高级编程——守护进程
一.守护进程简介 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系 ...
- ROC曲线的AUC(以及其他评价指标的简介)知识整理
相关评价指标在这片文章里有很好介绍 信息检索(IR)的评价指标介绍 - 准确率.召回率.F1.mAP.ROC.AUC:http://blog.csdn.net/marising/article/det ...
- EBS DBA指南笔记(一)
第一章 ORACLE APPLICATIONS 的组件与架构 1.ebs组件的几大构成:客户端,form server,web server,concurrent processor,数据库.每个组 ...
- 尚学堂马士兵struts2 课堂笔记(二)
14通配符问题 其实这个问题看一个例子就ok <package name="actions" extends="struts-default" names ...
- C语言--字符串和数字的相互转换
1.数字转换为字符串 sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出. sprintf 是个变参函数,定义如下: int sp ...
- java的制作"时间账本"
一直以来我都感觉自己的时间过得好荒废啊,貌似只是打开了一个网页链接的时间,一个下午便过去了:仿佛就是看了看空间,刷了刷微信,一天就过去了.哈,当然这是夸张的说法.但是我仔细地算了一下,大概我们每个人每 ...
- 跨平台移动APP开发进阶(一)mui开发注意事项
mui开发注意事项 Mui HTML5开发框架 mui是一个高性能的HTML5开发框架,从UI到效率,都在极力追求原生体验:这个框架自身有一些规则,刚接触的同学不很熟悉,特总结本文:想了解mui更详细 ...