- Backstracking
https://leetcode.com/problems/n-queens/
The n-queens puzzle is the problem of placing n
queens on an n x 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.
Example 1:
Input: n = 4
Output: [[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above
Example 2:
Input: n = 1
Output: [[“Q”]]
Constraints:
1 <= n <= 9
题目分析
n皇后问题是回溯算法解决的经典问题。
首先来看一下皇后们的约束条件:
-
不能同行
-
不能同列
-
不能同斜线
确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。
下面用一个3 * 3 的棋牌,将搜索过程抽象为一颗树,如图:
注意,为了方便理解,暂时屏蔽皇后们“不能同斜线”的约束条件。
从图可看出,二维矩阵中矩阵的高就是这颗树的高度,矩阵的宽就是树型结构中每一个节点的宽度(有多少个子节点)。
那么我们用皇后们的约束条件,来回溯搜索这颗树,只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了。
回溯三弄
根据经典回溯模板编程:
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
函数签名
-
List<String> rows
:当前遍历行前的皇后摆法。 -
int lengthOfSide
:棋盘单边有多少格,也就是N皇后的N。 -
int depth
:目前递归深度,它的最大值是lengthOfSide
。 -
List<List<String>> result
:存放符合要求N皇后摆法。
代码如下:
private void backstracking(List rows, int lengthOfSide, int depth, List<List> result) {
}
终止条件
回看题目分析的例图,当递归到棋盘最底层(也就是叶子节点)的时候,就可以收集结果并返回了。
代码如下:
if (rows.size() == lengthOfSide) {
result.add(new ArrayList<>(rows));
return;
}
遍历过程
首先,验证皇后摆法是否合法,皇后们不能同行,同列,同斜线,代码如下:
private boolean isValid(List rows, int row, int col, int lengthOfSide) {
// 上方向
for (int i = row - 1; i > -1; i–) {
if (rows.get(i).charAt(col) == ‘Q’)
return false;
}
// 左上斜线方向
for (int i = row - 1, j = col - 1; i > -1 && j > -1; i–, j–) {
if (rows.get(i).charAt(j) == ‘Q’)
return false;
}
// 右上斜线方向
for (int i = row - 1, j = col + 1; i > -1 && j < lengthOfSide; i–, j++) {
if (rows.get(i).charAt(j) == ‘Q’)
return false;
}
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
![img](https://img-blog.csdnimg.cn/img_convert/9b171f3e2c6be74910f29b5a3b1bed5c.jpeg)
总结
蚂蚁面试比较重视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。
经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
视基础,所以Java那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年1班,很有青春的感觉。面试官基本水平都比较高,基本都P7以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。
经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。
[外链图片转存中…(img-hKQ1mqQS-1711395908604)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!