格子游戏- 算法设计与分析.pptVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
格子游戏 算法设计与分析第1次作业解题报告 game 2011.09.23 问题描述 小D最近迷上了一个游戏,这个游戏的规则是这样的:假设地上有成一条直线的N 个格子,小D有一个弹珠,以第1格为起点,第N 格为终点。移动的时候可以在以下数中选择一个数作为移动步数 A[0]……A[m] 移动要耗费MP对应的移动耗费的MP为 B[0]……B[m] 若弹珠离终点的格数小于移动的格数,则回退剩余格数。例如弹珠离终点5格,而弹珠要移动8格,则移动5格到终点,然后回退3格。 小D想知道对于给定的N,a[0]……a[m]和b[0]……b[m],弹珠能不能移动到终点,如果可以损耗的最少精力是多少。 1 N 2 3 输入输出 数据输入: 输入数据第一行包含两个整数N(0N=100000),M(0M=10),表示有N个格子和M种可以走的步数。接下来两行,第一行有M 个数A[0]……A[M]表示可以走的格子数,第二行有M个数B[0]……B[M]表示对应耗费的精力。测试数据有多组数据,你必须处理到文件末尾(EOF)。 结果输出: 如果不能走到终点,输出Impossible,否则输出最小消耗的精力 输入示例 11 2 1 3 1 2 11 1 3 1 输出示例 7 Impossible 问题的理解和分析 本题类似于背包问题,即求解达到目标所消耗的最小代价或得到的最大利益。 这是一个组合优化的问题,求解的关键在于如何更新每一步消耗的最小精力,以及停止条件的判断。 可以将格子当成一个站点,每个站点到其他站点有权值不同的单向通路,由此构成单向赋权图,问题即转换成求解源站点到目的站点的最短路径。 算法与数据结构的选取 算法设计 设计一个算法,求解源点到目的点的最短路径, 本题采用dijkstra算法作为贪心算法。 数据结构 采用优先队列保存扩展顶点集,使得每一轮扩展顶点和查找最小耗费的顶点过程所花的时间能在O(log(nm))。 设计思路 设计一个保存站点位置和当前源点到该点的最小耗费值的类。 初始状态:扩展顶点集T仅有源点S,该点的最小耗费为0,将S加入集合T中,其余顶点的dist值为设定的最大值MAX_MAX; 类型 成员名 描述 int id 站点位置 int dist 源点到该点的最小耗费 Q_Node类 设计思路 扩展顶点:当T不为空时,每次从中取出最小耗费的顶点V,根据移动步数a扩展该顶点(若当前位置加上移动步数大于终点位置,则需要进行回退),得到它的邻接顶点集U; 更新最小耗费:若取出顶点的dist值加上该点到一个邻接顶点Ui的耗费的精力b小于邻接顶点Ui的dist值,则更新distj=disti+bij; 当取出的顶点为终点时,算法结束。若终点的dist值等于MAX_MAX说明不可达,否则即为最小耗费值。 4 2 2 1 算法演示 input output 5 2 3 1 3 1 2 1 0 push 1 0 pop push push 1 2 pop 3 5 2 3 pop 4 3 4 4 5 3 pop 3 4 pop 2 NA 3 NA 4 NA 5 NA 1 2 2 3 3 核心代码 dist[s]=0;//初始顶点到本身的最小耗费为0 first.id=s; first.dist=0; q.push(first);//压入初始顶点 while(!q.empty()) { Q_Node pop_node; pop_node=q.top(); q.pop();//从优先队列中取出最小耗费的顶点 if(pop_node.id==t||dist[pop_node.id]==MAX_MAX) break;//当前顶点为终点时算法结束 for (j=0;jm;j++) {//按移动步数扩展该顶点 if (pop_node.id+a[j]t)

文档评论(0)

peace0308 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档