赞
踩
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例 1:
输入:n = 4
输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[[“Q”]]
提示:
1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
小白式写法:
·通过不断更换皇后的位置来确定最后皇后所在的位置。
·利用一维数组存储各个皇后所在的位置。
·在判断是否存在攻击(即是否在同一行、同一列或对角线)中,使用了一个比较特殊的比较方式(借鉴别的大佬的):
判断对角线:
Math.abs( x - i ) == Math.abs( array[x] - array[i] )
注:x 为当前摆放的皇后,i 为之前已经摆放好的皇后,如果相等,则代表在对角线上
具体代码如下:
class Solution { private static List<List<String>> result; private static int[] array; // 存放每个皇后摆放的位置 private static int max; // 存储皇后的数量,这里只是为了方便调用 public static List<List<String>> solveNQueens(int n) { max = n; result = new ArrayList<List<String>>(); array = new int[max]; dfs(0); // 从第一个开始摆放 return result; } private static void dfs(int i) { if( i == max ) { // 如果已经摆放完了最后一个,则返回 add(); return; } for( int x = 0; x < max; x++) { array[i] = x; // 将当前皇后先摆放到该位置 if( check(i) ) dfs( i + 1 ); // 如果该皇后所在的位置不会冲突,则继续摆放下一个 } } private static boolean check(int x) { for( int i = 0; i < x; i++) { // 从第一个检查到当前皇后 if( array[x] == array[i] || // 检查列。由于每一个皇后都从新的列开始摆放,所以不用检查行 Math.abs(x - i) == Math.abs(array[x] - array[i]) ) { // 检查对角线 return false; } } return true; } private static void add() { // 向结果List中添加 List<String> temp = new ArrayList<String>(); for( int i = 0; i < max; i++) { String s = new String(); for( int j = 0; j < max; j++) { if( j == array[i] ) s += 'Q'; else s += '.'; } temp.add(s); } result.add(temp); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。