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的国际象棋上摆放八个皇后,使其不能相互攻击,即 ...
 
随机推荐
- 解决Scrollview 嵌套recyclerview不能显示,高度不正常的问题
			
我们先看一个效果,问题说的就是中间的Grid效果在Scrollview 嵌套recyclerview显示问题,在Android Api 24是好的,不过在5,1,1版本(api 22)缺出现了问题 最 ...
 - 从Eclipse插件中读取资源
			
可以通过Eclipse里的OSGi的Bundle类,获取插件目录下的某个文件的输入流: 1. Bundle bundle = Platform.getBundle(Activator.PLUGIN_I ...
 - MySql下视图的创建
			
 (1).第一类:create view v as select * from table; (2).第二类:create view v as select id,name,age from ta ...
 - LOV里的值直接引用系统里定义的值集的值,且具有值集的安全性控制
			
fnd_flex_server.check_value_security(p_security_check_mode => 'YH', p_flex_value_set_id => p_f ...
 - Android(Lollipop/5.0) Material Design(二) 入门指南
			
Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...
 - iOS中 读取相册,调用系统相机 技术分享
			
技术内容:分别读取相册以及调取相机,将图片显示到imageView上 布局: 1.创建imageView 和 button 并为button一个关联pickerImage的事件 <div sty ...
 - leetcode   217 Contains Duplicate 数组中是否有重复的数字
			
 Contains Duplicate Total Accepted: 26477 Total Submissions: 73478 My Submissions Given an array o ...
 - UIEvent UIResponder UI_04
			
1.事件(UIEvent),是由硬件设备捕捉到用户对设备的操作,把这个操作抽象成一个事件对象 ios中三大事件:触Touches摸晃动事件Motion,远程控制事件RemoteControl: ...
 - 用CSS指定外部链接的样式
			
大部分的信息类网站,比如维基百科,都会对外部链接(<a>标签)指定特定的样式.作为用户,一眼就知道该链接是指向另一个站点的资源是很好的体验.许多网站在服务器端做外部链接检查,添加一个`re ...
 - 【翻译】在Sencha Touch中创建离线/在线代理
			
原文:Creating an Online/Offline proxy in Sencha Touch 概述 在Sencha Touch中,一个常见的需求就是,当设备在没有连接互联网的时候,应用程序必 ...