回溯算法与八皇后问题
回溯法:在递归构造中,生成和检查的过程可以有机结合起来,从而减少不必要的枚举。把问题分解为若干个步骤求解时,如果当前步骤没有合法选择,则函数将返回上一级的递归调用,该现象称为回溯法。所以递归枚举通常被称为回溯。
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
回溯算法与八皇后问题相关推荐
- 回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案
回溯算法解决八皇后 4-皇后问题 (4 - Queen's problem) In 4- queens problem, we have 4 queens to be placed on a 4*4 ...
- 数据结构与算法 / 回溯算法(八皇后、0 - 1 背包)
回溯算法,顾名思义,就是在没有得到最优解的前提下,不断的返回至前面的岔路口位置,重新选择,直至遍历了所有的情况或者得到的预期最优解的情况下再结束. 与贪心算法不同的是,回溯算法理论上是可以得到最优解, ...
- 回溯算法-03八皇后问题
八皇后问题 简介 回溯法的经典问题. 问题描述 有8*8=64个格子,每个格子里面可以放一个棋子,现在要求任意两个棋子不在一条横向.纵向或者斜向的直线上. 问题分析 显然,每一行.每一列都只有一个棋子 ...
- 数据结构 - 递归 回溯算法(八皇后问题)
游戏地址自己写完了可以根据结果去测试一下. 算法分析 八皇后问题算法思路分析 1)第一个皇后先放第一行第一列 2)第二个皇后放在第二行第一列.然后判断是否OK, 如果不OK,继续放在.第二列.第三列. ...
- 回溯算法解决八皇后问题(JAVA实现)
送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...
- 用递归思想和回溯算法解决八皇后问题(java实现)
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- 经典回溯算法(八皇后问题)详解
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...
- 【回溯法】八皇后问题
问题描述 在国际象棋棋盘(8×8)(8\times8)(8×8)上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 皇后可以攻击处于同一行.同一列和同一对角线上的棋子. 思路分析 八皇后问题可以使用 ...
- 栈(Stack)的应用—试探回溯法:八皇后问题、迷宫寻径
栈的应用 试探回溯法 1.八皇后问题 皇后类 struct Queen { //皇后类int x, y; //坐标Queen (int xx = 0, int yy = 0 ) : x(xx), y( ...
- 回溯法(八皇后问题)及C语言实现
回溯法,又被称为"试探法".解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择.这种走不通就回退再走的 ...
最新文章
- 一文看透全球光伏“大跃进”发展历程
- js之操作JSON数据
- 如何通过简化标题来提升核心关键词排名?
- 启动两个Tomcat的方法
- 使用JSON.parse(),JSON.stringify()实现对对象的深拷贝
- C# 委托(Delegate)
- 我理解的HBSE应用场景(交流篇)
- sum服务器如何接显示器,sum服务器监控
- 第十三题:子类要调用继承自父类的方法,必须使用super关键字。
- java同步读写,关于java:Collections中的synchronizedMap方法是否同步读写操作
- 【C++对象模型】第一章 关于对象
- 使用Pls_Integer的好处
- java类 (二):内部类
- 【官方方法】ROS源
- 使用短生命周期容器(Ephemeral Containers)构建微服务化的工作流
- matlab实现QPSK调制解调
- lisp 获取横断面数据_AutoCADLISP二次开发辅助道路横断面测量成果检查
- 是指可以显示网页服务器或者文件,浏览器是指可以显示网页服务器或者文件系统的HTML文件(标准通用标记语言的一个应用)内容,并让用户与这些文件交互的一种软件。...
- Treap(二)——#10144. 「一本通 4.6 练习 1」宠物收养所
- php 大转盘抽奖概率 角度,在线抽奖大转盘和概率计算