跳马问题中存在多种算法思想.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
跳马问题中存在多种算法思想

跳马问题中存在多种算法思想   在信息量飞速增长的现代社会中,如何有效地获取和处理信息已成了信息技术教师面对的课题之一。如何有条理地分析各种问题中的有用数据,发现数据的变化规律,制订相应的处理方法,构建解决整个问题的流程,也成了教师们的日常工作之一。众所周知,计算机的特征是运算速度快、精度高,在精确的控制之下,一切都会按部就班地执行,从而提高效率。如果我们能很好地利用计算机这个工具,那么我们就只需做个规划者,而繁琐的处理过程就可以留给计算机来执行。下面我就以对一个问题的分析来说明流程控制中的多样性。   问题描述:   设一个m*n的棋盘,在棋盘上左下角的A点(0,0)有一个中国象棋的马,并约定马走的规则是:①马走日字;②马只能向右走。任务:编程读入m,n,请打印出一条从A(0,0)到B(m,n)的路径。   跳马问题也称为骑士遍历问题,是一道非常古老的题目了,好多人在讲回溯算法时都喜欢用到这个例子,因为这是适合用回溯法解决的一个经典例子,它仅用一张平面表格就把阶段、状态、决策等因素直观而又抽象地展现在人们面前。但我们不希望仅以一道或几道经典题目,让学生掌握一种算法,而是从不同的角度、方向来分析当前这种变化规则,找到适合的方法来处理目前这种变化,从而提高学生的解题适应能力。   ● 回溯法适用于解决多阶段决策问题中求单路径、全路径等   用回溯法解决跳马问题的基本思想是从起点开始每一步先作出选择,再判断,再跨出到下一步,重复上述过程,每一步的跨出都会离目的地越来越近,但当到不了目的地时,回退一步,如果可以作出新的选择,则重新跨出,否则再退,以此类推。上述过程可以借助于图形进行模拟,让学生先清楚整个过程。接下来便是每一步骤的语言描述及控制。其中每一步所做出的选择必须记录,否则回退时不能做出新的选择。   求单路径的流程图如下:   参考程序:   program knight1;   const dx:array[1..4] of integer=(1,2,2,1);    dy:array[1..4] of integer=(-2,-1,1,2);    max=1000;   var x,y,m,k,i,mm,nn:integer;    b:array[0..max] of integer;   begin    write(input m,n:);    readln(mm,nn);    x:=0;y:=0;    m:=0;    k:=0;    for i:=0 to max do b[i]:=0;    while (xmm) or (ynn) do {目标点为(mm,nn)}    begin    k:=k+1; {找个方向}    if k4 then begin k:=b[m]; {没有方向可跳,则回溯}    m:=m-1;    x:=x-dx[k];    y:=y-dy[k];    end    else    if (x+dx[k]=0) or (y+dy[k]);    for i:=1 to m do    begin    x:=x+dx[b[i]];    y:=y+dy[b[i]];    if im then write((,x,,,y,),---)    else writeln((,x,,,y,));    end;    readln;   end.   以上是求从起点到终点的一条路径,这是一种能深入先深入,否则回退,换条路走的思维方式,即深度优先搜索。但能否把所有路径都打印出来呢?引导学生继续思考。也就是一条路径找到后,不能结束,要继续找下一条路径,因此结束条件要更改。观察B数组的变化规则,只能当所有路径找全后,也就是数组B的每一位都为最大值,才能让程序结束,这是一种记数现象,但要判断每一位是否达到最大值较繁琐,我们再加一,也就是第一位的前一位发生变化,因此采用0位做标记位,初始化为0,当为1时结束。但调试程序后发现有201错误,也就是数组超界情况。仔细观察发现当回退到B数组的0位时,K的值为0,也就是会发生dx[0],dy[0]的现象,根据现象采用两种不同的控制方式:①加判断语句,当K为0时不做x:=x-dx[k],y:=y-dy[k];②当K为0时,用BREAK结束程序。   ● 用递归思想解决问题   在用回溯法分析这个问题之后,学生对跳马问题的解题思路已经有了一定的了解,那我们还可以让学生用递归的思想来分析这个问题。也就是从问题的规模出发,不同规模的问题解决方案是否一致,能否找到大规模问题与小规模问题(子问题)间的关系,并建立递归模型。本题在每一步上存在四种选择,如果选择合适(

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档