【DFS】n皇后问题
回溯:
递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧,全排列的交换法,数独,部分和,用到了回溯。下一个状态在开始之前需要利用到之前的状态,此时需要进行回溯,因为之前的状态对现在的状态存在着影响。
剪枝:
深度优先搜索的时候如果已经明确从当前状态无论如何转移都不会存在(更优)解,就应该终止往下的继续搜索,这种方法叫做剪枝。数独和部分和里面有剪枝:属于隐性的剪枝,当尝试去填一个数字的时候发现某些数字不行那么会把这个这条支路给剪断。当使用if条件的时候把限定条件加进去然后在if里面使用调用dfs,这也是剪枝的一种。高级的剪枝在调用dfs之前对情况进行预判来进行提前剪枝。
题目:n皇后问题
请设计一种算法,解决著名的n皇后问题。这里的n皇后问题指在一个n*n的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。给定一个int n,请返回方法数,保证n小于等于15。
注意:因为题目中只要求求出摆放的方法数,而不需要求解出其中的过程那么我们就不需要进行回溯,如果需要给出摆放的过程那么就需要进行回溯。此外这个题目不需要进行回溯的另外一个原因是回退到平行状态的时候我们不需要考虑同行的棋子对现在退回来的状态的影响,因为位于for循环中我们进入平行状态的同一行的下一列考虑这个位置上是否可以摆放,所以我们不用进行回溯只需要记录其中的摆放的方法数即可。
代码:
public class N皇后问题 { static int n;
static int cnt; static int[] rec; // 下标代表行,值代表列 public static void main(String[] args) {
n = 4;
rec = new int[4];
dfs(0);
System.out.println(cnt);
} /**
* @param row 当前正在处理的行
*/
private static void dfs(int row) {
if (row == n) {
cnt++;
return;
}
// 关于检查这个点能不能放的问题 想法就是将将所有不能放的地方的值存为-1,发现不太行。
// 依次尝试在某列上放一个皇后
for (int col = 0; col < n; col++) {
boolean ok = true;
// 检验这个皇后是否和之前已经放置的皇后有冲突
for (int i = 0; i < row; i++) {
// 正对角线 x-y相同,副对角线x+y相同
if (rec[i] == col || i + rec[i] == row + col || rec[i] - i == col - row) {
ok = false;
break;
}
}
/* =======这里可以认为是剪枝======= */
// 这一行的这一列可以放
if (ok) {
rec[row] = col; // 标记
dfs(row + 1); // 继续找下一行
// rec[row]=0; //恢复原状,这种解法这里是否恢复状态都行
}
}
} }
结果:
【DFS】n皇后问题的更多相关文章
- kb-01-a<简单搜索--dfs八皇后问题变种>
题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的 ...
- dfs 例题皇后问题
题目描述 一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列 ...
- 八皇后(dfs+回溯)
重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...
- hdu 2553 N皇后问题 (经典DFS)
题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...
- HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告
前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...
- HDOJ2553-N皇后问题(DFS)
N皇后问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 2553 N皇后问题(dfs)
N皇后问题 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 在 ...
- n皇后问题<dfs>
n皇后问题指的是: n*n的国际象棋棋盘上摆放n个皇后,使其不能互相攻击, 即任意两个皇后都不能处于同一行.同一列或同一斜线上, 问有多少种摆法. 和一般n皇后问题不同的是,现在棋盘上有可能已经放了一 ...
- 八皇后问题 dfs/递归
#include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; ...
- 洛谷 P1219 八皇后【经典DFS,温习搜索】
P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
随机推荐
- pod BaiduMapKit 报错解决方案
错误信息 [!] Error installing BaiduMapKit [!] /usr/bin/git clone https://github.com/BaiduLBS/BaiduMapKit ...
- 《剑指offer》扑克牌顺子
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 客户端和浏览器都不能连接SVN服务器
错误提示 1.在对话框中提示 2.在As上提示 Error:svn: E731001: Unable to connect to a repository at URL 'https://XXX/sv ...
- Ubuntu安装Sublime Text3插件Emmet的依赖PyV8
通常情况下,插件是放在运行目录的Packages目录下,经过多番搜索资料,以及验证,ST3将插件放在来Installed Packages目录下,为此,如果遇到无法更新Emmet依赖库PyV8的时候, ...
- net读取文件字节流要注意的小细节
]; var numBytesToRead = (int)fileLenght; ; using (fs) { do { ); numBytesRead += n; numBytesToRead -= ...
- Docker 学习6 Docker存储卷
一.什么是存储卷 二.为什么要用到数据卷 三.数据卷是怎么被管理的 四.存储卷种类 五.在容器中使用存储卷 1.只声明容器路径 [root@localhost docker]# docker run ...
- *CTF 2019 quicksort、babyshell、upxofcpp
这次参加比赛总共出了三道,有两道队友都先交了,还是tcl,heap_master卡了差不多一天没解决....还是记录一下出的题目吧 quicksort 题目大体流程就是输入要输入的数字数量,然后输入数 ...
- java写word转pdf
https://blog.csdn.net/csdnFlyFun/article/details/79523262
- FlaskWeb开发:基于Python的Web应用开发实战
所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/63/ 来源:python黑洞网,专注 ...
- python kafka权限校验client.id
kafka集群有权限校验,在连接时需要加入client.id.但pykafka不能配置该选项.搜索了一下,需要使用confluent-kafka 链接: https://blog.csdn.net/l ...