- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[迷宫算法
迷宫算法
算法思想:findpath首先创建一个足够大的堆栈,然后对偏移量数组进行初始化,并在迷宫周围增加一圈障碍物。在while循环中,从当前位置here出发,按下列次序来选择下一个移动位置:向右、向下、向左、向上。如果能够移动到下一个位置,则将当前位置放入堆栈path,并移动到下一个位置。如果找不到下一个可移动的位置,则退到前一个位置。如果无法回退一个位置(即堆栈为空),则表明不存在通往出口路径。当回退至堆栈的顶部位置(next)时,可以重新选择另一个可能的相邻位置,这可利用next和here来推算。注意here是next的一个邻居。对下一个移动位置选择可用以下代码来实现:
If(next.row==here.row)//推算next可移动位置的个数
Option=2+next.col-here.col;
else option=3+next.row;
Struct position{//位置int row;//行
Int col;//列
}position;
Status FindPath()
{//寻找从位置(1,1)到出口(m,m)的路径
Position offset[4];
Offset[0].row=0;offset[0].col=1;//向右
Offset[1].row=1;offset[1].col=0;//向下
Offset[2].row=0;offset[2].col=-1;//向左
Offset[3].row=-1;offset[3].col=0;//向上
//在迷宫周围增加一圈障碍物
for(int i=0;i=m+1;i++)
{
maze[0][i]=maze[m+1][i]=1;//底和顶
maze[i][0]=maze[i][m+1]=1;//左和右
}
//优点:是程序不必处理边界条件,简化代码设计。
Path=new StackPosition(m*m-1);
Position here;
here.row=1;
here.col=1;
maze[1][1]=1;//阻止返回入口
int option=3;
while(here.row!=mhere.col!=m)//不是出口
{//寻找并移动到一个相邻位置
int r,c;
while(option=LastOption)
{
r=here.row+offset[option].row;//设置相邻格点
c=here.col+offset[option].col;
if(maze[r][c]==0) break;
option++;
}
//找到一个相邻位置了吗?
if(option=LastOption)
{//移动到maze[r][c]
path-add(here);
here.row=r;
here.col=c;
//设置障碍以阻止再次访问
maze[r][c]=1;
option=0;
}
else{//没有可用的相邻位置,回溯
(path-isEmpty()) return OK;
Position next;
Path-Delete(next);//退回至栈顶位置next
If(next.row==here.row)//推算next可移动位置的个数
Option=2+next.col-here.col;
else option=3+next.row;
here=next;
}
return ERROR;
}
最短路径算法
算法思想:程序首先检查start 和finish是否相同,如果相同,则路径长度为0,程序终止。否则设置一堵由封锁位置构成的“围墙”,把网格包围起来。然后对offset数组进行初始化,并在起始位置上标记2。借助于队列Q并从位置start开始,直到移动到下start相距为1的网格位置,然后移动到start相距为2的网格位置,不断继续下去,直到到达位置finish或者无法继续移动到下一个新的、空白的位置。在后一种情况下,将不存在到达位置finish的路径,而在前一种情况下,位置finish将得到一个相应的编号。
如果到达了finish,则可以利用网格上的标号来重构路径。路径上的位置(start除外)均被存储在数组path之中。
Status FindPath(Position start,Position finish,int Pathlen,Position*path)
{//寻找从start到finish的路径
if((start.row==finish.row)(start.col==finish.col))
{
Pathlen=0;
return OK;}
Position offset[4];
Offset[0].row=0;offset[0].col=1;//向右
Offset[1]
您可能关注的文档
最近下载
- 建筑施工安全操作规程汇编.doc VIP
- HG-T 21522-2014 水平吊盖板式平焊法兰人孔.pdf VIP
- doc 9835国际民航组织语言能力要求实施手册.pdf
- 2025医院医德医风教育培训计划方案.docx VIP
- 2025-2026学年湘艺版(2024)初中音乐八年级上册(全册)教学设计(附目录P322).pdf
- 《食品加工机械与设备》全套教学课件.pptx
- 安徽省A10联盟2026届高三上学期9月底学情调研政治试题及答案.pdf
- 云南康旅控股集团有限公司笔试.pdf
- (粮油)仓储管理员职业技能鉴定考试题库(含答案).docx VIP
- 课件:宋代饮茶艺术+点茶实操.pptx VIP
文档评论(0)