- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
                        查看更多
                        
                    
                下一步是把那些邻接方格它们所有可能走的方向上的所有邻接
                     迷宫问题 毛悠然
思想:
通过邻接的方格逐步可以达到最后出口。我们可以把每一步所有可能走的方向上的邻接方格都排列起来,下一步是把那些邻接方格它们所有可能走的方向上的所有邻接方格也继续排列起来,①显然,如果一个方格任何方向上都没有可走的邻接方格,我们就不再需要它,可以剔除;②同样,一个方格所有可能走的方向上的邻接方格都已经列出来后,我们已经知道了后续搜索方向,也就不再需要这个方格,也可以剔除;③重复下去,我们会搜索到所有能走的到方格,当发现有一个方格已是出口后停止。④因为先搜索到的方格在排列出其后续搜索的邻接方格之后,先被剔除,如果把排列方格看成是按顺序进入一个队列,剔除方格正好是队头元素出队,所以可以用队列结构解决迷宫路径搜索问题。(宽度优先的搜索过程)
搜索方向设置:
设置一个队列sq[]记录搜索路径,从数组 maze[1][1]开始搜索时将每个方格下标推入队列,以(i,j)为中心向8个邻域搜索时下标变化如表1.3所示。
表1.3 (i,j)为中心搜索8个邻接区域时下标增量设置
8		1		2			i-1,j-1	i-1,j	i-1,j+1			7	i,j-1	i,j	i,j+1	3			i+1,j-1	i+1,j	i+1,j+1			6		5		4		
算法说明:
为了算法方便,在四周加上一圈哨兵 ,即变为数组maze[0… m+1, 0…n+1]表示迷宫。用数组zx, zy 表示x,y 方向上的移动增量。记录的踪迹应该包括当前位置和前趋位置。最后根据rear所指的前驱序号回溯得到走出迷宫的最短路径。 
源代码:
#include 
#define m 10
#define n 15
#define MAX 400
struct node int x,y;//方格点坐标
		int pre; //前趋点指示
 ;
int maze[m][n]; //迷宫数组
int front,rear;
struct node sq[MAX];//既是纪录搜索路经的数组又是队结构(非循环队)
int zx[8],zy[8];
void printpace int rear //打印迷宫路径; int i;
	i rear;
	do printf  %d, %d  --, sq[i].x, sq[i].y ;
		i sq[i].pre;
	 while i! 0 ; void mazep //搜索迷宫路径 int i, j, x, y, v, front, rear, find;
	sq[1].x 1; sq[1].y 1; sq[1].pre 0;
	find 0;
	front 1; rear 1; maze[1][1] -1;
	while front  rear!find x sq[front].x; y sq[front].y;
		for v 1; v  8; v++ i x+zx[v]; j y+zy[v]; if maze[i][j]  0 rear++; sq[rear].x i; sq[rear].y j; sq[rear].pre front; maze[i][j] -1; if i  m  j  n printpace rear ; find 1; front++; if !find    printf 不存在走出迷宫的路径!\n ; void main int i, j;
	for i 1; i  m; i++ for j 1; j  n; j++ printf 请您输入第%d行第%d列的状态数: 0 或 1\n, i, j ; scanf %1d, maze[i][j] ; for i 0; i  m+1; i++ maze[i][0] 1; maze[i][n+1] 1; for j 0; j  n+1; j++ maze[0][j] 1; maze[m+1][j] 1; zx[1] -1;zx[2] -1;zx[1] 0;zx[4] 1;zx[5] 1;zx[6] 1; zx[7] 0; zx[8] -1; zy[1] 0; zy[2] 1; zy[3] 1;zy[4] 1;zy[5] 0;zy[6] -1;zy[7] -1;zy[8] -1;
	printf 走出迷宫的路径如下 数字表示迷宫元素状态的下标 :\n ;
	mazep  ; 程序结果:
 9, 10  -- 8, 9  -- 7, 9  -- 6, 9  -- 5, 10  -- 4, 11  -- 3, 10  -- 3, 9  -- 4,
8  -- 3, 7  -- 2, 7  -- 1, 6  -- 1, 5  -- 2, 4  -- 1, 3  -- 1, 2  -- 1, 1  --Pre
                 原创力文档
原创力文档 
                        

文档评论(0)