递归与算法算法专题.pptVIP

  • 4
  • 0
  • 约2.27千字
  • 约 11页
  • 2017-11-30 发布于江西
  • 举报
递归与算法算法专题

递归与回溯算法专题 主要内容 回溯法的基本思想 回溯法的常用方法 应用举例 得分得分得十分 是非得失发的十分飞 回溯常用方法 主要解法与思想 问题分析: 第一步 定义问题的解空间 这个问题解空间就是8个皇后在棋盘中的位置. 第二步 定义解空间的结构 可以使用8*8的数组,但由于任意两个皇后都不能在同行,我们可以用数组下标表示 行,数组的值来表示皇后放的列,故可以简化为一个一维数组x[9]。 第三步 以深度优先的方式搜索解空间,并在搜索过程使用剪枝函数来剪枝 根据条件:x[i] == x[k]判断处于同一列 abs(k-i) == abs(x[k]-x[i]判断是否处于同一斜线 解析代码如下: POJ1321棋盘问题 POJ1321棋盘问题 即简化的八皇后问题 题目详情请看下载网页 * * ACM 组 吴国龙 一.基本思想: 从问题的某一种可能出发, 搜索从这种情况出发所能达到的 所有可 能, 当这一条路走到 尽头 的时候, 再倒回出发点, 从另一个可能出发, 继续搜索. 这种不断 回溯 寻找解的方法, 称作 回溯法 . 二.一般步骤 1.定义一个解空间,它包含问题的解。? 2.利用适于搜索的方法组织解空间。 3.利用深度优先法搜索解空间。 4.利用限界函数避免移动到不可能产生解的子空间。 回溯法基本思想与步骤 1.递归回溯法 void RBacktrack (int k) { for(每个x[k],使得x[k]∈T(x[0],x[1]…x[k-1]) (Bk(x[0],x[1]…x[k]))) { if((x[0],x[1]…x[k])是一个可行解) 输出x[0],x[1]…x[k]; else RBacktrack(k+1); } } 2.迭代回溯法 void IBacktrack (int n) { int k; while(k=0) { if(还有尚未检测的x[k]∈T(x[0],x[1]…x[k-1])(Bk(x[0],x[1]…x[k]))) { if((x[0],x[1]…x[k])是一个可行解) 输出x[0],x[1]…x[k]; k++; } else k--; } } 在8×8格的棋盘上放置彼此不受攻击的8个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。8后问题等价于在8×8格的棋盘上放置8个皇后,任何2个皇后不放在同一行或同一列或同一斜线上,哪么一共有多少种解法呢?? 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 Q Q Q Q Q Q Q Q 1 2 3 4 5 6 7 8 应用举例 8-皇后问题 #includeiostream #includecmath using namespace std; int x[9]; int sum=1; void print(){ //输出当前可能的解 //cout第sum种可能解是:endl; for(int i = 1; i = 8; i++) cout x[i] ; cout endl; sum++; } bool canPlace(int k){ //剪枝函数---检查当前列能否放置皇后 for(int i = 1; i k; i++){ if(x[i] == x[k] || abs(k-i) == abs(x[k]-x[i])) //判断处于同一列或同一斜线 return false; } return true; } void queen(int i){ //回溯尝试皇后位置,i为行数 if(i 8){ print();

文档评论(0)

1亿VIP精品文档

相关文档