具体问题如下图

先看一下4*4的回溯过程

程序结束条件: 一组解:设标志,找到一解后更改标志,以标志做为结束循环的条件。 所有解:k=0

判断约束函数判断第k个后能不能放在x[k]处 两个皇后不能放在统一斜线上: 若2个皇后放置的位置分别是(i,j)和(k,l), 且 i-j = k -l 或 i+j = k+l,则说明这2个皇后处于同一斜线上。

下面是利用递归和非递归实现的代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int x[];
  5. int sum=;
  6.  
  7. /*
  8. 判断第k个后能不能放在x[k]处
  9. 两个皇后不能放在统一斜线上:
  10. 若2个皇后放置的位置分别是(i,j)和(k,l),
  11. 且 i-j = k -l 或 i+j = k+l,则说明这2个皇后处于同一斜线上。
  12. */
  13. void output(){
  14. cout << "第" <<sum << "种放置方法为:" << endl;
  15. for(int i=;i<=n;i++){
  16. cout << "(" <<i << "," << x[i] << ")" << endl;
  17. }
  18.  
  19. }
  20. int place(int k){
  21. for(int j=;j<k;j++){
  22. if(x[j]==x[k] || abs(x[j]-x[k])== abs(j-k))
  23. return ;
  24. }
  25. return ;
  26. }
  27. void BackTrace(int t,int n){//递归
  28. if(t>n){////如果t>n说明已经完成一次放置
  29. sum++;
  30. output();
  31. }
  32. else{
  33. for(int i=;i<=n;i++){
  34. x[t]=i;
  35. if(place(t)){// //可以放在i位置处,则继续搜索
  36. BackTrace(t+,n);
  37. }
  38. }
  39.  
  40. }
  41. }
  42.  
  43. void BackTrace1(int n){//非递归
  44. int k;
  45. x[]=;
  46. k=;
  47. while(k>=){
  48. x[k]+=;////先放在第一个位置
  49. while((x[k]<=n && !(place(k)))){//如果不能放
  50. x[k]++;// //放在下一个位置
  51. }
  52. if(x[k]<=n){
  53. if(k==n){// //如果已经放完了n个皇后
  54. sum++;
  55. output();
  56. }
  57. else{// //没有处理完,让k自加,处理下一个皇后
  58. k++;
  59. x[k]=;
  60. }
  61. }else{// 当前无法完成放置,则进行剪枝,回溯回去,回到第k-1步
  62. k--;
  63. }
  64. }
  65. }
  66. int main()
  67. {
  68. memset(x,,sizeof(x));
  69. cin >> n;
  70. cout << n << "皇后的放置方法为" << endl;
  71. //BackTrace(1,n);
  72. BackTrace1(n);
  73. return ;
  74. }

运行结果如下

皇后个数要大于3才有可行结

n皇后问题_回溯法的更多相关文章

  1. 实现n皇后问题(回溯法)

    /*======================================== 功能:实现n皇后问题,这里实现4皇后问题 算法:回溯法 ============================= ...

  2. 01背包问题_回溯法&分支限界法

    package 分支限界法; import java.util.LinkedList; import java.util.Scanner; /*01背包问题*/ public class ZOPack ...

  3. JS算法之八皇后问题(回溯法)

    八皇后这个经典的算法网上有很多种思路,我学习了之后自己实现了一下,现在大概说说我的思路给大家参考一下,也算记录一下,以免以后自己忘了要重新想一遍. 八皇后问题 八皇后问题,是一个古老而著名的问题,是回 ...

  4. n皇后问题(回溯法)——Python实现

      八皇后问题 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  5. Leetcode之回溯法专题-51. N皇后(N-Queens)

    Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...

  6. P1074 靶形数独 dfs回溯法

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶 ...

  7. Java算法——回溯法

    回溯法一种选优搜索法,又称试探法.利用试探性的方法,在包含问题所有解的解空间树中,将可能的结果搜索一遍,从而获得满足条件的解.搜索过程采用深度遍历策略,并随时判定结点是否满足条件要求,满足要求就继续向 ...

  8. 回溯法解决N皇后问题(以四皇后为例)

    以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...

  9. HDU 2553 n皇后问题(回溯法)

     DFS Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description ...

随机推荐

  1. java学习进度条四

  2. Linux课程---7、shell技巧(获取帮助命令)

    Linux课程---7.shell技巧(获取帮助命令) 一.总结 一句话总结: ls --help:简单手册 man ls:内容手册 1.tab补全? 命令+tab:加快敲命令敲文件目录的速度,多敲几 ...

  3. 修改(python) mysql 数据库 使其可以支持插入中文

    先建立一个数据库,名字叫xsk #!/usr/bin/python3 # -*- coding:utf-8 -*- import pymsql # 打开数据库连接(本机,用户,密码,数据库名) db ...

  4. message消息框

    .messager.show options 在屏幕右下角显示一条消息窗口.该选项参数是一个可配置的对象:showType:定义将如何显示该消息.可用值有:null,slide,fade,show.默 ...

  5. Simple Rtmp Server的安装与简单使用

    Simple Rtmp Server是一个国人编写的开源的RTMP/HLS流媒体服务器. 功能与nginx-rtmp-module类似, 可以实现rtmp/hls的分发. 有关nginx-rtmp-m ...

  6. 【Facebook】等差子序列个数

    题目: 给定一整数数列,问数列有多少个子序列是等差数列. 即对于包含N个数的数列A,A(0),A(1),……,A(N-1),有多少组(P(0),P(1),……,P(k))满足0<=P(0)< ...

  7. Poj 1936,3302 Subsequence(LCS)

    一.Description(3302) Given a string s of length n, a subsequence of it, is defined as another string ...

  8. Scala总结

    Scala总结 ===概述 scala是一门以Java虚拟机(JVM)为目标运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言. scala是纯粹的面向对象的语言.java虽然是面 ...

  9. Python模块-chardet模块

    chardet模块用来获取文件的编码 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import chardet f = o ...

  10. HTML表格中<td scope="col">与<td scope="row">的含义

    HTML表格中<td scope="col">与<td scope="row">的含义 表格中 <td scope="c ...