- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
搜索7.1最多因子数源程序名divisors.(pas,c,cpp)可执行文件
搜索
71 最多因子数7.2 黑白棋游戏 s15=s xor 3
同样的,还可以推出a14和a15交换后得到的新状态s14为:
s14=s xor 6=s xor (3*21)
当然,还有以下很多状态公式:
s13=s xor 12=s xor(3*22)
s11=s xor 48=s xor(3*24)
s10=s xor 96=s xor(3*25)
这里有两个需要注意之点:
(1)交换的两个棋子的颜色必须不同,否则公式不成立;
(2)根据状态转换的定义s4、s8、s12、s16对应的公式不成立,因为它们右边没有相邻的棋子。
最后,我们总结一下左右相邻情况下的状态转换公式(棋子颜色必须不同)
sk=s xor(3*215-k),其中k≠4, 8, 12, 16
与“左右相邻”对应的是“上下相邻”。“上下相邻”情况的分析与“左右相邻”类似,这里就不详细展开了,只列出转换的公式(同样,棋子颜色也必须不同)
sk=s xor(17*212-k),其中k≤12
有了上面两个状态转换的公式,我们只需将起始状态和目标状态转换成16bit的整数,利用公式从起始状态扩展至目标状态即可。整个过程的时间复杂度是O(24*216)。
从另一个角度考虑问题。本题给出了起始状态和目标状态,那么我们完全可以从这两个状态开始,分别扩展——也就是用双向宽度优先搜索的方法来解决本题。一般来说,双向搜索扩展出的状态总数要比单向少很多,时间和空间复杂度都会有所降低。7.3 纵横填字游戏 …… ……
图7-5
如图7-5,设一个长度为L的单词的第i1、i2、…in位上已经被确定下来,那么一种可以选择的Hash函数是
这里,p可以是任取的一个数(一般来说,p取质数效果比较好),HASHLEN是Hash表的长度(一般也是取质数效果较佳)。
设计完了Hash函数以后,一切的做法就一目了然了:首先确定一个搜索的顺序,根据每一步空位上确定的字母的位置,对每个单词按特定的Hash函数计算其Hash函数值,并将其放入Hash表(建议用“吊桶法”处理冲突),这是一个初始化的过程。然后,按前面定的顺序进行搜索(这个顺序最好是每次都选能确定字母数最多空位),根据确定的字母计算出合法单词对应的Hash函数值,并从Hash表中取出所有合法单词(当然,也可能会取出少量的非法单词,可以稍加判断将其去除),进行枚举。
算法的总体思想是利用Hash表来快速的查找合法单词,以达到可行性剪枝的目的。
最后,我们来简单分析一下算法的复杂性。由于使用了Hash表,复杂度是概率的,很难估算。需要指出的是,待选的单词表是一个词典,词典一般是正态分布的,所以除了搜索的第一层以外,以后的合法单词肯定都是很少的,再加上合法性剪枝的成分,实际上程序的效率应该是很高的。但是,这个算法毕竟还是指数级的,虽然使用了Hash表基本上把所有的无用功都去掉了(当然,还会有一些非法单词产生冲突,不过,当Hash表长度达到单词数的两倍以上后,这样的冲突概率一般都很小,基本可以忽略)。指数级的算法肯定不是一个完美的算法,所以如果数据非常强的话,这个算法也是有可能超时的,只是这样的数据很难出,至少现在还没能找出这样的数据来。
7.4 魔术数字游戏7.5 魔板7.6 三维扫描7.7 拼字游戏7.8 小木棍7.9 单词游戏
源程序名 words.???(pas, c, cpp)
可执行文件名 words.exe
输入文件名 words.in
输出文件名 words.out 【问题描述】
Io和Ao在玩一个单词游戏。
他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致。
游戏可以从任何一个单词开始。
任何单词禁止说两遍,游戏中只能使用给定词典中含有的单词。
游戏的复杂度定义为游戏中所使用的单词长度总和。
编写程序,求出使用一本给定的词典来玩这个游戏所能达到的游戏最大可能复杂度。
【输入】
输入文件的第一行,表示一个自然数N(1≤N≤16),N表示一本字典中包含的单词数量以下的每一行包含字典中的一个单词,每一个单词是由字母A、E、I、O和U组成的一个字符串,每个单词的长度将小于等于100,所有的单词是不一样的。
【输出】
输出文件仅有一行,表示该游戏的最大可能复杂度。
【样例】
words.in words.out
5 16
IOO
IUUO
AI
文档评论(0)