八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:

在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上

(斜率为1),问有多少种摆法。高斯认为有76种方案。

1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

计算机发明后,有多种方法可以解决此问题。

算法思路:

     首先我们分析一下问题的解,我们每取出一个皇后,放入一行,共有八种不同的放法,

然后再放第二个皇后,同样如果不考虑规则,还是有八种放法。

于是我们可以用一个八叉树来描述这个过程。从根节点开始,树每增加一层,便是多放一个皇后,

直到第8层(根节点为0层),最后得到一个完全八叉树。  

紧接着我们开始用深度优先遍历这个八叉树,在遍历的过程中,进行相应的条件的判断。以便去掉不合规则的子树。

    那么具体用什么条件来进行子树的裁剪呢?

    我们先对问题解的结构做一个约定。

 用X[i]来表示,在第i行,皇后放在了X[i]这个位置。

 于是我们考虑第一个条件,不能再同一行,同一列于是我们得到x[i]不能相同。

剩下一个条件是不能位于对角线上,这个条件不是很明显,我们经过分析得到,

设两个不同的皇后分别在j,k行上,x[j],x[k]分别表示在j,k行的那一列上。

那么不在同一对角线的条件可以写为abs((j-k))!=abs(x[j]-x[k]),其中abs为求绝对值的函数。

#include<iostream>
using namespace std;
int num;
int *x;
int sum;
bool place(int k)
{for(int j = 1;j<k;j++)if(abs(x[k] - x[j]) == abs(k-j)||x[j] == x[k])return false;return true;}
void backtrack(int t)
{if(t>num) //num为皇后的数目{sum++;//sum为所有的可行的解for(int m = 1;m<=num;m++){cout<<"<"<<m<<","<<x[m]<<">";//这一行用输出当递归到叶节点的时候,一个可行解}cout<<endl;}elsefor(int i = 1;i<=num;i++){x[t] = i;if(place(t)) backtrack(t+1);//此处的place函数用来进行我们上面所说的条件的判断,如果成立,进入下一级递归}
}
void main()
{num = 8;sum = 0;x = new int[num+1];for(int i= 0;i<=num;i++)x[i] = 0;backtrack(1);cout<<"方案共有"<<sum<<endl;delete []x;}

经典回溯算法(八皇后问题)详解相关推荐

  1. 回溯算法(八皇后问题)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  2. 八皇后问题详解(最短代码)

    八皇后问题算法分析: 分析1:八皇后由一个64格的方块组成,那么把八个皇后放入不考虑其他情况利用穷举法,有8^64种 可能. 分析2:显然任意一行有且仅有1个皇后,使用数组queen[0->7] ...

  3. 分治回溯算法----八皇后问题

    八皇后问题:在一个8×8的棋盘中,放入8个皇后棋子,要求同行同列同斜线不能有重复的皇后棋子,八皇后问题一共有92种解法.如图所示:即八皇后问题的一个解. //分治回溯算法解决八皇后问题 public ...

  4. 八皇后问题详解(四种解法)

    所有源码都在github上(https://github.com/seasonyao/eight_queen_question) 如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问 ...

  5. 学习笔记-回溯算法(八皇后问题)暴力法

    八皇后问题暴力解决法(介绍代码有说明) 先展示结果: 我这里用的是一维数组来展示的结果 array={7,3,0,2,5,1,6,4} 7的下标为0, 在这里下标+1表示的是第几个皇后也是行的位置,a ...

  6. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

  7. 【算法】递归|迷宫回溯问题|八皇后问题

    [算法]递归|迷宫回溯问题|八皇后问题   迷宫回溯问题,要用动态的眼光来看待这个递归算法. package com.serein.recursion;/*** @author baichuan* @ ...

  8. Java经典面试题整理及答案详解(八)

    简介: Java经典面试题第八节来啦!本节面试题包含了进程.线程.Object类.虚拟内存等相关内容,希望大家多多练习,早日拿下心仪offer- 了解更多: Java经典面试题整理及答案详解(一) J ...

  9. 即时通讯音视频开发(十八):详解音频编解码的原理、演进和应用选型

    1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性, ...

  10. 回溯算法n皇后问题_使用回溯算法的N Queen问题和解决方案

    回溯算法n皇后问题 N-皇后问题 (N - Queen's problem) The n – queen problem is the generalized problem of 8-queens ...

最新文章

  1. Oracle RAC系列之:利用srvctl管理RAC数据库
  2. LeetCode Implement Trie (Prefix Tree)(字典树)
  3. Android Studio 3.0 安装注意点
  4. Java Scanner nextLine()方法与示例
  5. cj20n sap 报错未知列的名称_SAP,PS模块配置和操作手册
  6. 分布式业务Redis安装与集群配置
  7. 微服务 订单交易支付系统架构演进
  8. 三校生计算机word基础知识,江西省2017年三校生计算机高考试卷
  9. VS2010中文版MSDN下载地址
  10. 转载《2020年校招面经心得》
  11. Redis生成自增流水号,每日清零
  12. 计算机组成原理重点考试范围,计算机组成原理重点整理(白中英版) 考试必备
  13. 项目需求变更原因及处理
  14. 简单飞机模型静态/模态分析
  15. 分组急救技能竞赛方法在急诊专科护士培训中的运用
  16. SRS低延时配置分析
  17. 学生管理系统的mysql数据库设计_MySQL数据库--学生管理系统数据库设计
  18. 考研线性代数深入理解
  19. 台达DVP-EH3系列PLC如何实现远程编程调试和程序上下载?
  20. 考企业管理概论可以带计算机吗,自考《企业管理概论》的考试技巧有哪些?

热门文章

  1. opencc php,优雅的简繁体转换OpenCC
  2. 初学PracticalAI
  3. Java编写USB接口,模拟计算机启动过程和关闭过程
  4. 连那样的委屈都受不了!
  5. linux dhclient,linux – 为什么dhclient不会使用我告诉它请求的静态IP?
  6. mysql数据库如何创建uuid
  7. VS2017 C++ Catch单元测试-实例 tcy
  8. 黑冰防火墙的设置和卸载
  9. 写类文件时候版本版权信息格式
  10. mysql蛇形转驼峰_myssql数据库表名转驼峰