- 1、本文档共66页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
0时刻 1时刻 2时刻 3时刻 0时刻和2时刻是一样的 1时刻和3时刻是一样的。 稍加分析:此Guard循环以2为周期循环。 状态转移,需要的信息是:Robot位置,Guard位置。 Position of Robot1, 2是的作用就是记录Robot位置。 Time的作用就是为了计算Guard的位置 状态:(position of Robot1, position of Robot2, Time) Time=10000,这是状态数过多的罪魁祸首! 题目说:Guard巡逻经过的格子数只可能是2, 3, 4。 也就是说机器人巡逻周期只能是2, 4, 6。 [2, 4, 6]=12,所以第0时刻、12时刻、24时刻……Guard的状态完全相同。 12可以看作Guard的周期。Time只要记录当前是第几个周期。因为周期确定了,Guard的位置也完全确定了! 0=Time=11 状态数(n*n)*(n*n)*12=12n4。 用BFS算法,标志数组判重。 时间复杂度O(12n4)。 n=20 完全可以承受 ^-^ * 分析 状态:待扩展的字母序号i。 由于该变量的存储量太大,因此我们将s设为全局变量; 边界条件:产生了一个满足条件的字串,即 i=n+1; 搜索范围:从’a’开始的后p个字符; 约束条件:当前字串没有相邻子串相等的情况 procedure solve (i: integer); var j, k: integer; t : longint ; begin if i=n+1 then {若产生了一个满足条件的字串,则输出} begin writeln (s); inc( t );exit {回溯} end; for k←1 to p do {搜索每一个可填字母} begin s←s+chr(64 + k );j←1;{检查当前字串是否符合条件} while (j=i div 2) and (copy(s,length(s)-j+1,j)copy(s,length(s)-2*j+1,j)) do inc (j); if ji div 2 then solve(i+1); {若当前字串符合条件,则递归扩展下一个字母} delete( s, length (s), 1 ) {恢复填前的字串} end; end; 记忆化搜索 1. 递归前对尚待搜索的信息进行预处理 如果搜索对象是通过某种运算直接得出其结果的,那么搜索前一般需进行预处理—通过相应运算将所有搜索对象的计算结果置入常量表,搜索过程中只要将当前搜索对象的结果值从常量表取出即可。 2.记忆化搜索 如果解答树中存在一些性质相同的子树,那么,只要我们知道了其中一棵子树的性质,就可以根据这个信息,导出其它子树的性质。这就是自顶向下记忆化搜索的基本思想。 序关系计数 用关系’’和’=’将3个数a、b和c依次排列有13种不同的关系: abc, ab=c, acb, a=bc, a=b=c, a=cb, bac, ba=c, bca, b=ca, cab, ca=b, cba。 输入n 输出n个数依序排列时有多少种关系。 1 、枚举所有序关系表达式 由于类似于‘a=b’和‘b=a’的序关系表达式是等价的,为此,规定等号前面的大写字母在ASCII表中的序号,必须比等号后面的字母序号小。 状态(Step,First,Can):其中Step表示当前确定第Step个关系符号;First表示当前大写字母中最小字母的序号;Can是一个集合,集合中的元素是还可以使用的大写字母序号 边界条件(step=n):即确定了最后关系符号 搜索范围(First≤i≤n):枚举当前大写字母的序号 约束条件(i in Can):序号为i的大写字母可以使用 procedure Count(Step,First,Can); {从当前状态出发,递归计算序关系表达式数} begin if Step=n then begin {若确定了最后一个关系符号,则输出统计结果} for i←First to n do if i in Can then Inc(Total); Exit {回溯} end;{then} for i←First to n do
文档评论(0)