leetcode--N 皇后 II(java)
leetcode 52 题 - N 皇后 II (困难)
原题链接:
https://leetcode.cn/problems/n-queens-ii/
题目描述
n 皇后问题 研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。
示例1:
输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例2 :
输入:n = 1
输出:1
解题思路
我们用递归来解决这个问题:
我们一行一行的去验证哪列可以放置皇后,
(因此这个思路就推导出,需要循环加递归)
每到一行,我们只需要验证他前面皇后放的位置,来确定他哪里能放.
验证的方法:
同一列有的肯定不能放了
还有就是斜线位置怎么验证,
举个例子:
A 点(1,2) 和B 点 (2,3) 这两个点在一条斜线上,
那么 1-2 肯定等于 2 - 3 .,
也就是A 的行号 - B 的行号 等于A 的列号 - B 的列号.
代码演示
代码可以放到leetcode 上去测试
public int totalNQueens(int n) {
if(n < 1){
return 0;
}
// 这个数组 下标来记录行号 值代表列 记录哪行哪列有皇后
int[] ans = new int[n];
return process(0,ans,n);
}
/**
* i 代表 行号
* n 总共几个皇后
* record 记录已经防置皇后的位置
*/
public int process(int i,int[]record,int n){
//i == n 代表所有行都校验通过才来到这里 所以返回一种方案
if(i == n){
return 1;
}
int res = 0;
//j 代表列号 每到一个行我们就考察所有列,能放在哪一列上
for(int j = 0;j < n;j ){
if(checkPostion(record,i,j)){
//皇后位置记录下来
record[i] = j;
//递归 行号加1
res = process(i 1,record,n);
}
}
return res;
}
/**
* 验证这个位置可以放不可以放
*/
public boolean checkPostion(int[]record,int i,int j){
for(int k = 0; k < i;k ){
//同一列有皇后不能放,和斜线有皇后不能放
if(record[k] == j || Math.abs(record[k] - j) == Math.abs(i - k)){
return false;
}
}
return true;
}
动态规划专题
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhggiebf
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13