一个走迷宫的程序 电脑资料Word文档格式.docx
《一个走迷宫的程序 电脑资料Word文档格式.docx》由会员分享,可在线阅读,更多相关《一个走迷宫的程序 电脑资料Word文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
![一个走迷宫的程序 电脑资料Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/2/bfd6b98c-7bc7-4fb7-9a87-9d1d092e8cdd/bfd6b98c-7bc7-4fb7-9a87-9d1d092e8cdd1.gif)
//行坐标
inty;
//列坐标
}STEP;
typedefstruct____trix
intdata[MAX_WIDTH+2][MAX_WIDTH+2];
//迷宫数据,0:
表示有路,1:
表示墙
intwidth;
//矩阵(迷宫)的宽,包括最左和最有2堵墙
intheight;
//矩阵(迷宫)的宽,包括顶部和底部2堵墙
STEPentran___;
//迷宫入口
STEPexit;
//迷宫出口
}MATRIX;
迷宫矩阵的每一个元素可以是0或1,0表示可走,1表示是墙,走不通。
为了便于检查是否越界,即坐标超过迷宫的范围。
在迷宫的4个边增加了全1数据,表示4堵墙,这样,在任何时候,都不会越界。
下面的数据表示1个5×
5的迷宫,增加了4堵墙后,实际宽度和高度变为7,迷宫变成1个7×
7的矩阵
1,1,1,1,1,1,1,
1,0,0,0,0,0,1,
1,1,0,1,0,1,1,
1,0,0,1,1,1,1,
1,0,1,0,0,0,1,
1,0,0,0,1,0,1,
2.算法
走迷宫的路径的每一步可用二元组(x,y)来表示。
已经走过的路径放入数组path。
首先,将入口的坐标放入数组,此时path数组的元素个数为1.
接下来使用下面的规则,试图找到一条出路
1.从当前位置(即数组的最后一个元素),从右,下,左,上四个方向搜索,看能否走通。
如果可找到一条通路,则
将新的位置的坐标放入path数组,数组长度加1.
如果新的位置的坐标等于出口的坐标,搜索结束。
如果从各个方向都走不通,则
将迷宫当前位置的元素置为1,这样,当前点就变成墙,下次就不会走到这个位置了。
并将数组的最有一个元素丢弃,数组长度减1
如果数组的长度为0,没有任何路径可以走通,搜索结束。
全部的代码见下:
[cpp]viewplaincopy
#include
#defineMAX_WIDTH30
#defineMAX_HEIGHT30
MATRIXg____trix=//初始化为一个迷宫,程序也能从文件中读入迷宫数据
{1,1,1,1,1,1,1},
{1,0,0,0,0,0,1},
{1,1,0,1,0,1,1},
{1,0,0,1,1,1,1},
{1,0,1,0,0,0,1},
{1,0,0,0,1,0,1},
},
7,7,//7行,7列,包括4堵墙
{1,1},//入口坐标
{5,5}//出口坐标
};
staticSTEPs_shift[]=
{1,0},//向右走,x++,y不变
{0,1},//向下走,x不变,y++
{-1,0},//向左走,x--,y不变
{0,-1}//向上走,x不变,y--
voidprint_paths(STEPpath[],intpath_len)//打印走迷宫的路径
inti;
for(i=0;
i
if(i>
0)
printf("
->
"
);
(%d,%d)"
path[i].x,path[i].y);
}
voidprint_Matrix(MATRIX*pMatrix)//打印迷宫数据,迷宫数据包含4堵墙
inti,j;
iheight;
i++)
for(j=0;
jwidth;
j++)
if(j!
=0)
"
%d"
pMatrix->
data[i][j]);
\n"
intsearch_path(int___tric[MAX_WIDTH+2][MAX_WIDTH+2],
STEPpath[],intpath_len,STEPexit)
while
(1)
inti,bFind;
STEPnewPos;
for(bFind=0,i=0;
newPos.x=path[path_len-1].x+s_shift[i].x;
newPos.y=path[path_len-1].y+s_shift[i].y;
if(path_len==1)
if(g____trix.data[newPos.x][newPos.y]==0)
bFind=1;
break;
//找到一个位置
//path[path_len-1]表示当前位置,path[path_len-2]表示上一步的位置,
//如果新的位置等于上一个位置,将陷入循环,故要求新的位置不能是上一步的位置
elseif((newPos.x!
=path[path_len-2].x||newPos.y!
=path[path_len-2].y)&
&
g____trix.data[newPos.x][newPos.y]==0)
if(bFind)
path[path_len++]=newPos;
//将新的位置追加到path数组,路径长度+1
if(newPos.x==exit.x&
newPos.y==exit.y)
returnpath_len;
else
___tric[path[path_len-1].x][path[path_len-1].y]=1;
//从当前位置,无路可走,将当前位置标记为墙
模板,内容仅供参考