N 皇后 Java

  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);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值