当前位置:   article > 正文

N 皇后 Java_javan 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后;编写代码:求给一个整数 n ,返

javan 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后;编写代码:求给一个整数 n ,返
  1. N 皇后
    n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 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);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/161968
推荐阅读
相关标签
  

闽ICP备14008679号