码迷,mamicode.com
首页 > 编程语言 > 详细

[LeetCode][Java] N-Queens

时间:2015-07-15 11:12:55      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:leetcode   java   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.

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×n 的棋盘上摆放n个棋子,使棋子与棋子之间不冲突。

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

每个解中的棋子的摆放都不相同,‘Q‘ and ‘.‘ 分别代表着棋子和空白格。

比如说,

对于4皇后问题的两个不同的解为:

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

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

算法分析:

8皇后问题的要求为:使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
参考博客http://blog.csdn.net/u011095253/article/details/9158473

我们把这一题分成几个小问题

1. 传统的dfs递归

2. 验证放置Queen的地方是否合法

3. 输出Board结果

dfs的循环是指这一行里,从第一列到最后一列放置的所有可能,如果放置的地点通过isValid验证,通过cur+1进入下一行进行递归, 如果没通过验证,试下一个位置,如果所有位置都不Valid,跳回上一层

采用int[ ]的好处是,每一次我们只需改变一个数字就相当于改变了棋子的放置位置

isValid函数,首先int[ ]代表行,这样就避免了每一行出现重复的Queen (因为你不可能在一个int里面放2个值)这样简化了验证 接下来我们只需验证列和对角线

验证列的时候,要验证这一行之前的行有没有重复的(注意是验证之前的喔)

验证对角线,根据对角线性质,长 = 宽 那么我们不难写出 Math.abs(loc[i] - loc[cur]) == (cur - i) 

最后loc[]里面记录的是解的信息(如果有解)我们把它转换成String, 输出Board即可

AC代码:

public class Solution 
{
	public ArrayList<String[]> solveNQueens(int n) 
    {  
        ArrayList<String[]> res = new ArrayList<String[]>();  
        int[] loc = new int[n];  //记录皇后处于哪一列,列数组
        dfs(res,loc,0,n);  
        return res;  
    }  
    public void dfs(ArrayList<String[]> res, int[] loc, int cur, int n)
    {  
        if(cur==n)   
            printboard(res,loc,n);  
        else
        {  
            for(int i=0;i<n;i++)
            {  
                loc[cur] = i;  
                if(isValid(loc,cur))  
                    dfs(res,loc,cur+1,n);  //再放皇后m+1, 如果皇后m+1放完并返回了  
                                           //两种可能:  1:冲突,返回了  2.一直将所有的皇后全部放完并安全返回了  
                                           //将皇后m回溯,探索新的可能或者安全的位置  --->
            }  
        }  
    }  
    public boolean isValid(int[] loc, int cur)
    {  
        for(int i=0;i<cur;i++)//只需要保证与那些已经就位的皇后不冲突即可  
        {  
            if(loc[i]==loc[cur]||Math.abs(loc[i]-loc[cur])==(cur-i)) //验证对角线,根据对角线性质,长 = 宽 
                       return false;                                 // 那么我们不难写出 Math.abs(loc[i] - loc[cur]) == (cur - i) 
        }  
        return true;  
    }  
    public void printboard(ArrayList<String[]> res, int[] loc, int n)
    {  
        String[] ans = new String[n];  
        for(int i=0;i<n;i++)
        {  
            String row = new String();  
            for(int j=0;j<n;j++)
            {  
                if(j==loc[i]) row += "Q";  
                else row += ".";  
            }  
            ans[i] = row;  
        }  
        res.add(ans);  
    }  
}


版权声明:本文为博主原创文章,转载注明出处

[LeetCode][Java] N-Queens

标签:leetcode   java   n-queens   

原文地址:http://blog.csdn.net/evan123mg/article/details/46888993

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!