acm 搜索 .pptVIP

  • 23
  • 0
  • 约5.25万字
  • 约 290页
  • 2017-05-30 发布于上海
  • 举报
acm 搜索

搜索技术 包含的内容 回溯法 回溯+剪枝法 广度搜索 双向广度优先搜索 A,A*算法 渐进深度优先算法 爬山法 分支限界法 遗传算法 与或图与博弈树 模拟退火法 1.回溯法 回溯法概念 回溯法也称试探法. 它的基本思想是:从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。 这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。 回溯策略回溯搜索的示意 ? 1 A ? ? B 2 8 C   11 D ? ? E 3 F 6 9 G  10 H ? I 4 J 5 7 K 状态空间中回溯搜索 图中虚线箭头的方向表明了搜索的轨迹,结点边的数字表明了被搜索到的次序 ? 回溯法分析 采用递归,算法简单,时间复杂度比较大 采用迭代法,算法设计与题目相关度大,时间复杂度较小。 递归回溯:由于回溯法是对解空间的深度优先搜索,因此在一般情况下可用递归函数来实现回溯法如下: Proc Search(当前状态); begin If 当前状态等于目标状态 then exit; for 对所有可能的新状态 Search(新状态); end Procedure BACKTRACK(n); {k:=l; repeat if TK (x1,x2,...xK-1 )中的值未取遍then { xK:=TK (x1,x2,..., x K-1 )中未取过的一个值; if BK (x1, x2, ..., x K) then //状态结点(x1,...xk)被激活 if k=n then output(x1, x2, ..., xk) //输出一个回答结点 e1se k:=k + l;} //深度优先 e1se k:=k-l; //回溯 until k=0; end;{BACKTRACK} 本课件题库网站 /judgeonline/problemlist 1400题 马的走法 在一个4*5的棋盘上,马的起始位置坐标(纵、横)位置由键盘输入,求马能返回初始位置的所有不同走法的总数。(马的位置不能重复,马走“日”字。) 马的走法分析(1) 由于4*5问题规模小,采用基于递归的回溯法 问题定义: (1)采用二维数组表示棋盘。 (2)马走步表示方法二维数组,{{-1,-2},{-1,2},{-2,1},{-2,-1},{1,2},{1,-2},{2,1},{2,-1}},8个方向。 (3)棋盘的最小坐标,左下角为(1,1) (4)棋盘越界条件 0≤x ≤4, 0≤ y ≤5 (5)走过的棋盘位置应该设置一个标示。 马的走法分析(3) 递归的回溯算法可描述为: procedure search(now:position); {now是当前位置} begin for 马从当前位置now出发走一步到位置next的每一种走法 do begin if next在棋盘内 and next位置没有走过 then if next=出发点 then 不同走法总数加1 else begin 标记next已经走过了; search(next) 取消位置next的标记; end; end; end; #include?iostream using?namespace?std; const?int?ROWS?=?4;//行数 const?int?COLUMS?=?5;//列数 int?chess[ROWS][COLUMS];//棋盘 int?numCount?=?0; int?posX,posY; int?direction[2][8]={{-1,-1,-2,-2,2,2,1,1},{-2,2,1,-1,1,-1,2,-2}};//马走日字 void?Solve(int?x,int?y) { ????int?i,j,desX,desY; ????for?(i=0;i8;++i) ????{ ????????desX?=?x+direction[0][i];//目标位置x坐标 ????????desY?=?y+direction[1][i];//目标位置y坐标 ????????if?(desX=0desX4desY=0desY5chess[desX][desY]==0) ?

文档评论(0)

1亿VIP精品文档

相关文档