【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的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序 ...
 
随机推荐
- Linux搭建NodeJs环境
			
文件下载与解压 文件下载 wget https://npm.taobao.org/mirrors/node/v6.10.3/node-v6.10.3-linux-x64.tar.xz 如果要下载最新版 ...
 - vertx的Actor模型实现
			
前言 note: Context 与 EventLoop 关系 : N ; 每次创建一个vericles或者multi instances 通过EventLoopGroup.next挑出一个Event ...
 - overlay 文件系统
			
overlay文件系统浅析 overlayfs文件系统类似于aufs,相比aufs,overlay实现更简洁,很早就合入了linux主线, 合入主线后overlayfs修改为overlay. dock ...
 - Zabbix (五)
			
介绍添加主机时,各个参数的含义 https://blog.51cto.com/5001660/2154692 Zabbix配置介绍: https://blog.51cto.com/5001660/21 ...
 - Eclipse使用技巧 - 2. Eclipse自动补全功能轻松设置
			
本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框. Eclipse代码自动补全功能默认只包括 点”.” ,即只有输入”.”后才出现自动补全的提示框.想要自动补 ...
 - Springboot @Transactional Mysql事务 无效
			
JPA默认创建的表是MyISAM引擎,MyISAM引擎不支持事务操作 所以需要将将数据库引擎改为InnoDB 配置修改 spring.jpa.database-platform=org.hiberna ...
 - Angular Material design设计
			
官网: https://material.io/design/ https://meterial.io/components 优秀的Meterial design站点: http://material ...
 - dynamic动态类型的扩展方法
			
对于一个动态类型来说,你可以认为它包含任意成员,它们都能通过编译.但到了运行时,到底是否拥有这些成员,就真相大白了.如 dynamic test = ; Console.Write(test.Name ...
 - 大数据学习之Linux基础01
			
大数据学习之Linux基础 01:Linux简介 linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹 在1991年10月5日首次发布.,在加上用户空间的应用程序之后 ...
 - *CTF——shellcode
			
一看题目是利用shellcode解决问题 伪代码: checksec:开启了NX exp: from pwn import* context(os='linux',arch='amd64',log ...