回溯法:在递归构造中,生成和检查的过程可以有机结合起来,从而减少不必要的枚举。把问题分解为若干个步骤求解时,如果当前步骤没有合法选择,则函数将返回上一级的递归调用,该现象称为回溯法。所以递归枚举通常被称为回溯。

8皇后问题:在8*8的棋盘上放置了8个皇后,使得他们互不攻击,每个皇后的攻击范围为同行,同列和同对角线。要求找出共有多少种放法。

分析:最简单的思路是枚举“64个格子的子集”,使得子集中恰有8个格子满足条件。但是枚举64个格子有2^64,显然是个糟糕的模型。第二种思路是“从64个格子中选8个,然后判断是否满足条件“,根据组合数可知这个方案达到10^9数量级,比第一种方案好,但是也不够好。下面用回溯法来解决。用c[x]表示第x行

的皇后的列号,于是问题转变为了8!=40320生成全排列问题。下面给出了回溯法解决8皇后问题的代码:

int c[maxn];
int ans;
void dfs(int curr,int n){   //n皇后问题if (curr ==n){ ans++;return; }int i, j;for (i = 0; i <n; i++){c[curr] = i;  //尝试吧curr行的皇后放在第i列for (j = 0; j< curr; j++){//检查是否与已经放置的皇后冲突if (c[curr]== c[j] || c[curr] - curr == c[j] - j || c[curr] + curr == c[j] + j)break;}//j==i说明上述循环没有提前终止,放在i列是合理的if (j == curr) dfs(curr + 1,n);}
}

 可以继续提高程序效率。用vis[3][]来标记当前皇后所在的列和对角线是否有其他皇后的攻击,测试了一下,时间大约比上面代码快3倍多int vis[3][maxn];

int vis[3][maxn];
void dfs(int curr,int n){if (curr == n){ ans++; return; }for (int i = 0; i < n; i++){if (!vis[0][i] && !vis[1][curr + i] && !vis[2][curr - i + n]){vis[0][i] = vis[1][curr + i] = vis[2][curr - i + n] = 1;  //标记为放c[curr] = i;      //无需打印的话可以不使用数组cdfs(curr + 1, n);vis[0][i] = vis[1][curr + i] = vis[2][curr - i + n] = 0;  //撤销标记}}
}

  

转载于:https://www.cnblogs.com/td15980891505/p/5821030.html

回溯算法与八皇后问题相关推荐

  1. 回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案

    回溯算法解决八皇后 4-皇后问题 (4 - Queen's problem) In 4- queens problem, we have 4 queens to be placed on a 4*4 ...

  2. 数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)

    回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束. 与贪心算法不同的是,回溯算法理论上是可以得到最优解, ...

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

    八皇后问题 简介 回溯法的经典问题. 问题描述 有8*8=64个格子,每个格子里面可以放一个棋子,现在要求任意两个棋子不在一条横向.纵向或者斜向的直线上. 问题分析 显然,每一行.每一列都只有一个棋子 ...

  4. 数据结构 - 递归 回溯算法(八皇后问题)

    游戏地址自己写完了可以根据结果去测试一下. 算法分析 八皇后问题算法思路分析 1)第一个皇后先放第一行第一列 2)第二个皇后放在第二行第一列.然后判断是否OK, 如果不OK,继续放在.第二列.第三列. ...

  5. 回溯算法解决八皇后问题(JAVA实现)

    送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...

  6. 用递归思想和回溯算法解决八皇后问题(java实现)

    八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...

  7. 经典回溯算法(八皇后问题)详解

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...

  8. 【回溯法】八皇后问题

    问题描述 在国际象棋棋盘(8×8)(8\times8)(8×8)上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 皇后可以攻击处于同一行.同一列和同一对角线上的棋子. 思路分析 八皇后问题可以使用 ...

  9. 栈(Stack)的应用—试探回溯法:八皇后问题、迷宫寻径

    栈的应用 试探回溯法 1.八皇后问题 皇后类 struct Queen { //皇后类int x, y; //坐标Queen (int xx = 0, int yy = 0 ) : x(xx), y( ...

  10. 回溯法(八皇后问题)及C语言实现

    回溯法,又被称为"试探法".解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择.这种走不通就回退再走的 ...

最新文章

  1. 一文看透全球光伏“大跃进”发展历程
  2. js之操作JSON数据
  3. 如何通过简化标题来提升核心关键词排名?
  4. 启动两个Tomcat的方法
  5. 使用JSON.parse(),JSON.stringify()实现对对象的深拷贝
  6. C# 委托(Delegate)
  7. 我理解的HBSE应用场景(交流篇)
  8. sum服务器如何接显示器,sum服务器监控
  9. 第十三题:子类要调用继承自父类的方法,必须使用super关键字。
  10. java同步读写,关于java:Collections中的synchronizedMap方法是否同步读写操作
  11. 【C++对象模型】第一章 关于对象
  12. 使用Pls_Integer的好处
  13. java类 (二):内部类
  14. 【官方方法】ROS源
  15. 使用短生命周期容器(Ephemeral Containers)构建微服务化的工作流
  16. matlab实现QPSK调制解调
  17. lisp 获取横断面数据_AutoCADLISP二次开发辅助道路横断面测量成果检查
  18. 是指可以显示网页服务器或者文件,浏览器是指可以显示网页服务器或者文件系统的HTML文件(标准通用标记语言的一个应用)内容,并让用户与这些文件交互的一种软件。...
  19. Treap(二)——#10144. 「一本通 4.6 练习 1」宠物收养所
  20. php 大转盘抽奖概率 角度,在线抽奖大转盘和概率计算

热门文章

  1. Google Bigtable文章终于出炉
  2. 【招聘】哈工大讯飞联合实验室2022届提前批校园招聘
  3. 【BERT实践】看不懂bert没关系,用起来so easy!
  4. 【深度学习】你不了解的细节问题(四)
  5. 一道不起眼的面试题,但被头条面试官玩出了花,48张图,2个动画,带你还原面试现场
  6. 机器学习—XGBoost实战与调参
  7. 《Effective Java 3rd》读书笔记——类和接口
  8. 【震撼】《京东技术解密》获众大神集体推荐,4千人10年经验一次放送
  9. 博文视点大讲堂20期:Windows 7来了——知道你所不知道的Windows 7
  10. 矩阵的逆、伪逆、左右逆