力扣hot100 n皇后 满注释版 通俗易懂

本文介绍了使用Java解决经典问题51.N皇后问题的解决方案,通过递归和回溯法,检查皇后在棋盘上放置的合法性,最终返回所有可能的皇后布局。
摘要由CSDN通过智能技术生成

Problem: 51. N 皇后
在这里插入图片描述

文章目录

思路

👨‍🏫 参考地址

  • 考虑每一行哪个位置放皇后
  • 判断是否合法
  • 递归下一行

Code

class Solution {
	int n;
	char[][] board;
	List<List<String>> res = new ArrayList<>();

	public List<List<String>> solveNQueens(int n)
	{
		this.n = n;
		board = new char[n][n];
		// "." 表示空,"Q"表示皇后,初始化棋盘
		for (char[] cc : board)
			Arrays.fill(cc, '.');
		backtrack(0);
		return res;
	}

	private void backtrack(int row)
	{
		if (row == n)
		{
			res.add(charToList());
			return;
		}
		for (int col = 0; col < n; col++)// 列
		{
			if (!isValid(row, col))
				continue;
			board[row][col] = 'Q';
			backtrack(row + 1);
			board[row][col] = '.';
		}
	}

//	判断在 board[row][col] 放皇后是否合法,合法返回 true
	private boolean isValid(int row, int col)
	{
//	   	同列冲突检测
		for (int i = 0; i < n; i++)
			if (board[i][col] == 'Q')
				return false;
//		tips:当前左下方和右下方是没有棋子的
//		右上方冲突检测
		for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++)
			if (board[i][j] == 'Q')
				return false;
//		左上方冲突检测
		for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
			if (board[i][j] == 'Q')
				return false;
		return true;
	}

	/**
	 * 根据 board 字符数组 生成 棋盘字符串list
	 * 
	 * @return 棋盘字符串list
	 */
	private List<String> charToList()
	{
		List<String> ans = new ArrayList<>();
		for (char[] c : board)
			ans.add(String.copyValueOf(c));
		return ans;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值