回溯:  

  递归调用代表开启一个分支,如果希望这个分支返回后某些数据恢复到分支开启前的状态以便重新开始,就要使用到回溯技巧,全排列的交换法,数独,部分和,用到了回溯。下一个状态在开始之前需要利用到之前的状态,此时需要进行回溯,因为之前的状态对现在的状态存在着影响。

剪枝:

  深度优先搜索的时候如果已经明确从当前状态无论如何转移都不会存在(更优)解,就应该终止往下的继续搜索,这种方法叫做剪枝。数独和部分和里面有剪枝:属于隐性的剪枝,当尝试去填一个数字的时候发现某些数字不行那么会把这个这条支路给剪断。当使用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皇后问题的更多相关文章

  1. kb-01-a<简单搜索--dfs八皇后问题变种>

    题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的 ...

  2. dfs 例题皇后问题

    题目描述 一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列  ...

  3. 八皇后(dfs+回溯)

    重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...

  4. hdu 2553 N皇后问题 (经典DFS)

    题目链接:点击链接 思路:用一维数组hang[num] = i,num表示第num行,i表示第i列,计算n = 1~10皇后的不同放置数量,然后打表 #include<stdio.h> # ...

  5. HDU(搜索专题) 1000 N皇后问题(深度优先搜索DFS)解题报告

    前几天一直在忙一些事情,所以一直没来得及开始这个搜索专题的训练,今天做了下这个专题的第一题,皇后问题在我没有开始接受Axie的算法低强度训练前,就早有耳闻了,但一直不知道是什么类型的题目,今天一看,原 ...

  6. HDOJ2553-N皇后问题(DFS)

      N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. HDU 2553 N皇后问题(dfs)

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在 ...

  8. n皇后问题<dfs>

    n皇后问题指的是: n*n的国际象棋棋盘上摆放n个皇后,使其不能互相攻击, 即任意两个皇后都不能处于同一行.同一列或同一斜线上, 问有多少种摆法. 和一般n皇后问题不同的是,现在棋盘上有可能已经放了一 ...

  9. 八皇后问题 dfs/递归

    #include <bits/stdc++.h> using namespace std; const int maxn = 55; int ans=0; int vis_Q[maxn]; ...

  10. 洛谷 P1219 八皇后【经典DFS,温习搜索】

    P1219 八皇后 题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...

随机推荐

  1. open file /var/mobile/Media/DCIM 相册中获取到的视频地址使用 报错 视频文件不存在

    从相册中获取到的视频地址 例如  file:///var/mobile/Media/DCIM/100APPLE/IMG_9876.MOV 后面再使用的时候报错 视频文件不存在  那是因为在ios10. ...

  2. LR使用web_add_cookie函数进行cookie模拟

    1    为什么要使用cookie模拟 从日常项目测试过程中的问题说起.比如要进行论坛中的文件下载功能的测试.我们都知道只有登录用户才能进行下载操作,这样我们的测试过程可能就变成了先登录系统,然后再进 ...

  3. IntelliJ IDEA设置svn.exe的路径

    安装TortoiseSVN客户端时,必须选中command line client tools这个选项

  4. ubuntu apt不使用代理

    常见的问题是apt使用代理. 不过今天遇到的情况是,桌面进不去,只能tty:在tty界面下,发现1080端口上开着代理,/etc/environment和~/.bashrc中都确保注释掉了http_p ...

  5. swagger出现no response from server错误的解决办法

    解决办法:1.启用80端口2.如果不是使用的80端口,是用的nginx做了映射的其他端口的话可以用Springfox swagger-ui 覆盖默认request host,加上这个在spring的应 ...

  6. iOS 中文转拼音

    - (NSString * ) chineseToPinyin:(NSString *) chinese{ CFStringRef hanzi = (__bridge CFStringRef)(chi ...

  7. PostGIS导出SHP中文乱码

    设置系统的环境变量 PGCLIENTENCODING=GBK,退出PostgreSQL重新登錄,执行成功!

  8. TensorFlow之多核GPU的并行运算

    tensorflow多GPU并行计算 TensorFlow可以利用GPU加速深度学习模型的训练过程,在这里介绍一下利用多个GPU或者机器时,TensorFlow是如何进行多GPU并行计算的. 首先,T ...

  9. BZOJ.4212.神牛的养成计划(Trie 可持久化Trie)

    BZOJ 为啥hzw的题也是权限题啊 考虑能够匹配\(s1\)这一前缀的串有哪些性质.对所有串排序,能发现可以匹配\(s1\)的是一段区间,可以建一棵\(Trie\)求出来,设为\([l,r]\). ...

  10. Linux结束进程到底有多少种方法?

    我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个工具kill ...