(精)深度优先搜索.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
拓展:马拦过河卒 棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示,A点(0,?0)、B点(n,?m)(n,?m为不超过20的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。 【输入】 ?????? 一行四个数据,分别表示B点坐标和马的坐标。? 【输出】 ?????? 一个数据,表示所有的路径条数。 【样例输入】 6 6 3 2 【样例输出】 17 procedure dfs(step:integer); //尝试用编号为step的1*2长方形覆盖 var i, j, x, y : integer; flag : boolean; begin flag := false; //{先行后列找a[i,j]=0的格子} for i := 1 to n do begin if flag = true then break; for j := 1 to n do if a[i,j] = 0 then begin x := i; y := j; flag := true; break; end; end; a[x,y] := step; {格子(x,y)用编号i覆盖} if (x n) and (a[x+1,y] = 0) then {正下方格子未覆盖,用i覆盖} begin a[x+1,y] := step; if step * 2 = n * n then {最大编号为n*n/2} print else dfs(step+1); a[x+1,y] := 0; {回溯} end; if (y n) and (a[x,y+1] = 0) then {右方方格子未覆盖,用i覆盖} begin a[x,y+1] := step; if step * 2 = n * n then print else dfs(step+1); a[x,y+1] := 0; {回溯} end; a[x,y] := 0; {回溯} end; begin fillchar(a,sizeof(a),0); readln(n); dfs(1); writeln(tot); end. 例9:0/1背包问题 描述:给定n中物品和一背包,物品i的重量是wi,其价值为vi,背包的容量为C。如应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 输入 4 8 1 4 2 3 2 1 4 3 输出 1 0 1 1 分析:整个解的空间相当于一个二叉树,左边是0,代表不取这个物品,右边是1,代表取这个物品,然后进行DFS。 const maxn = 1000; var v, w : array[1..maxn] of integer; //所有物品的价值;物品的重量; x, bestx : array[1..maxn] of integer; //x暂存各物品的选中情况;物品的选中情况0/1 n, TotCap, bestval : integer; //物品的个数,背包的容量,最大价值 i : integer; procedure dfs(cv:integer; cw:integer; step:integer); //进行第 step种物品选择 //cw当前包内物品重量,cv当前包内物品价值 var i, k : integer; begin if step = n + 1 then

文档评论(0)

xiaofei2001128 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档