第一章 深度优先搜索.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第一章 深度优先搜索.doc

第一章 深度优先搜索 搜索是计算机程序设计竞赛中最常用的一种策略,对于那些一时难以找到规律或公式,或者根本没有规律或公式可循的问题,我们可以利用计算机高速运算的特点,用穷举策略来进行搜索。所谓穷举策略,原则地说,就是第一步只考虑问题的部分条件,根据这些条件,找到所有的满足这些部分条件的解,称之谓可行解;然后用尚未考虑的条件去一一检验那些可行解,筛去不符合条件的解,留下符合条件的解,那就是整个问题的解。 搜索可分为深度优先搜索和广度优先搜索。在深度优先搜索中,深度越大的结点越先得到扩展;而广度优先搜索则是深度越小的结点越先得到扩展。深度优先搜索的数据结构是堆栈;而广度优先搜索的数据结构是队列。下面我们首先学习深度优先搜索。 可以用深度优先搜索来处理的问题是各种各样的。如果搜索的深度已知或固定,则可用枚举法来进行;如果搜索的深度很深或不固定,则可用递归法和回溯法来进行。 第一节 枚举法 枚举法是一种我们十分熟悉的方法,它是用单重循环或多重循环嵌套的方法来穷举出所有可能出现的情况,然后对每种情况进行判断,找出满足条件的解来。由于用循环语句来进行穷举就必须预先知道循环变量的个数,这样才能设计循环嵌套的层数,所以它只能用于那些搜索的深度已知或固定的情况。当然,在解决一个具体的问题时,为了节省计算机的时间和空间资源,还要求我们尽可能地减少循环的层数和判断的次数,使程序的算法更加优化。 例1-1-1 值班安排问题 问题描述: 有A、B、C、D、E五个人,安排值周一、周二、周三、周四、周五的班,每人值一天,共有多少种不同的安排,编程打印输出各种安排。 算法分析: 由于是要求五个人安排在五天中值班,每个人都可以安排在周一到周五的任意一天中值班,只能也必须安排一次,所以本题是求排列枚举的问题,只要列出这五个人在五天中的全排列情况即求得了本题的解。 如果用五重循环来对这五个人在五天中进行安排,当然可以解得本题的解,但能不能再对算法进行一下优化呢?回答是肯定的。因为在外循环中的人排定了某个值班时间后,处于内循环的人就不能重复再排在这个时间了,因为一天只能排一个人值班。这样我们只要加入一些判断条件就可以使越到内层循环次数越少,而第五个人的安排更是不必循环了,因为这时只剩下唯一的一个时间而不容挑选了。剩下的问题是如何用数学方法来适当表述第五个人的安排时间,我们可以巧妙地利用周一到周五这五天时间的有序性,以1、2、3、4、5这五个数值分别代表这五天,则第五个人的安排时间就等于15减去前四个人的安排时间值之和,因为15是这五天时间值总和。 参考程序: PROGRAM ex1_1_1(input,output); VAR a,b,c,d,e : byte; n : word; BEGIN n := 0; for a := 1 to 5 do for b := 1 to 5 do if a b then {排除a、b两人同一天值班的情况} for c := 1 to 5 do if (a c) and (b c) then for d := 1 to 5 do if (a d) and (b d) and (c d) then begin e := 15-a-b-c-d; {此处优化可省去一重循环,因为五天序数和为15} n := n+1; writeln(No.,n:2, :, A : ,a, B : ,b, C : ,c, D : ,d, E : ,e); if n mod 24 = 0 then readln end END. 例1-1-2 取彩球问题 问题描述: 在 红、黄、蓝、黑、白 五种颜色的五个彩球中,取出三个彩球的各种取法共有多少种,编程打印输出各种取法。(求组合枚举) 算法分析: 此题与值班安排问题的区别是这五种颜色的彩球不要求区分取出的顺序,对于取出红、黄、蓝三个球和取出黄、蓝、红三个球认为是同一种取法,所以本题是求组合枚举的问题。 组合枚举与排列枚举的主要区别是每重循环的循环变量不需要在全部五种颜色中进行取球,因为至少要考虑两种情况下不必重复取球:一是外层循环变量已取过的颜色不必再取,二是要让出若干个位置让内层循环的变量取球。 参考程序: PROGRAM ex1_1_2(input,output); CONST s:array[1..5]of string=(Red,Yellow,B

文档评论(0)

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

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

1亿VIP精品文档

相关文档