1、& ly=pos.ly ); ; MazePos operator=(const MazePos pos) wx=pos.wx; ly=pos.ly; pass=pos.pass; path=pos.path; return *this;/End:MazePos-SElemType-/辅助栈元素类型class SElemType int ord; /迷宫通道块路径上的序号 MazePos seat; /通道块在迷宫中的位置坐标 int di; /从此通道块走向下一通道块的方向 /0:无效,1:东,2:南,3:西,4:北 bool operator=(const SElemType et) re
2、turn (seat=et.seat); SElemType operator=(const SElemType et) ord =et.ord ; seat =et.seat ; di =et.di ; return (*this);SElemType-/struct:MazeMap-/由通道块组成的迷宫地图#define MAPWIDTH 10#define MAPHEIGHT 10typedef struct MazeMap /由通道块矩阵构成 MazePos mazemapMAPWIDTHMAPHEIGHT;MazeMap;MazeMap-:MazeWay-/辅助出口路径链表元素类型t
3、ypedef struct MazeWayMazeWay;MazeWay-/Class:Maze-/主体类,迷宫路径问题求解class Maze Maze(int width=MAPWIDTH,int height=MAPHEIGHT); /生成迷宫地图 Maze(); void DoMaze(); /找出出口路径并显示private: bool InitOK; /初始化成功标志 MazeMap map; /迷宫地图 MazePos start,end; /迷宫的入口和出口 bool FindPath(); /主要函数,寻找出口路径 list mazeway; /存放出口路径的临时链表 voi
4、d RandMap(); /随机生成迷宫地图函数 bool CreateMap(bool init); /在初始和找到出口路径后生成相应地图函数 bool pass(MazePos curpos); /当前路径通道块是否可通(即是不是未经过的空块) MazePos NextPos(MazePos curpos,int di); /取得当前通道块当前方向上的下一个通道块 bool Invalide(SElemType e); /使当前通道块标记为不可通 void DisplayMaze(); /显示迷宫地图Maze:Maze(int width,int height) / /随机生成迷宫地图 C
5、reateMap(true); /显示地图 DisplayMaze();Maze() /Add codes herebool Maze:FindPath () /寻找出口,并生成出口路径链表 if(InitOK) /MazeStack mstack; stackSElemType,list mstack; MazePos curpos=start; int curstep=1; /经过的步数 MazeWay mw; /出口路径块元素 unsigned mwsize=mazeway.size (); /为显示运行过程而设 do if(pass(curpos) /如果当前位置可通(即是未走过的空块
6、) /封装栈元素,将当前位置进栈 SElemType e; e.ord =curstep; e.seat =curpos; e.di =1; mstack.push (e); /保存当前位置到出口路径链表 mw.wx =e.seat .wx ; mw.ly =e.seat .ly ; mazeway.push_back (mw); /如果是出口,则结束 if(curpos=end) return true; /不然就将得到下一个通道块 curpos=NextPos(curpos,e.di ); curstep+; else /当前位置不可通,则在栈内找到下一个位置 if(!mstack.emp
7、ty() e=mstack.top (); mstack.pop (); /调整出口路径链表 mazeway.pop_back (); while(e.di=0 | e.di =4) & !mstack.empty () Invalide(e); /标记刻通道块不能通过 /退回一步 if(mstack.empty () return false; else if( e.di5) e.di+; e.di=e.di%5; curpos=NextPos(e.seat ,e.di ); /*/显示运行过程 if(mwsize!=mazeway.size () ) CreateMap(false); m
8、wsize=mazeway.size (); Sleep(800); /要包含windows.h头文件 /* while(!mstack.empty ();MazePos Maze:NextPos(MazePos curpos,int di) MazePos pos; switch(di) case 1: pos=map.mazemap curpos.wx+1curpos.ly ; break; case 2: pos=map.mazemap curpos.wxcurpos.ly+1 ; case 3: pos=map.mazemap curpos.wx-1curpos.ly ; case 4
9、: pos=map.mazemap curpos.wxcurpos.ly-1 ; return pos;pass(MazePos curpos) /通过MazePos类型参数传递的信息检查MazeMap map; if(curpos.wx =MAPWIDTH | curpos.ly =MAPHEIGHT) return (map.mazemap curpos.wx curpos.ly .path =0 & map.mazemap curpos.wx curpos.ly .pass =false );void Maze:DoMaze ()InitOK) return; if(FindPath()
10、 coutendlNO PATH!endl;RandMap () /只能生成从左上到右下的迷宫地图 MazeWay curway; /随机生成的当前正处理的出口路径块(组成mw) mw; /随机生成的出口路径(由curway组成)iterator iter; /容器适配器 curway.wx =0; curway.ly =1; mw.push_back (curway); curway.wx +; srand(time(0); /取得当前时间作为随机数种子 while(curway.wx MAPWIDTH-1 & curway.ly MAPHEIGHT-1) if(rand()%2=1) /生
11、成随机X坐标上的路径块 /生成随机Y坐标上的路径块 curway.ly +; for(int y=0;yMAPHEIGHT;y+) for(int x=0;x=6) /数值越小,墙壁越多 /随机生成墙壁 map.mazemap xy.path =0; /生成空的通道块 /map.mazemap xy.pass =false; /生成出口路径 for(iter=mw.begin ();iter!=mw.end ();iter+) map.mazemap (*iter).wx (*iter).ly .path =0; /map.mazemap (*iter).wx (*iter).ly .pass
12、 =false; /生成入口和出口 start=map.mazemap mw.front ().wxmw.front ().ly; end=map.mazemap mw.back ().wxmw.back ().ly; /初始化成功 InitOK=true;CreateMap (bool init) if(init) RandMap(); if(map.mazemap xy.path =0) map.mazemap xy.pass =0; for(iter=mazeway.begin ();=mazeway.end (); map.mazemap (*iter).wx(*iter).ly .p
13、ath =1;Invalide (SElemType e) /通过SElemType类型参数传递的信息修正MazeMap map; if(e.seat .wx=MAPWIDTH | e.seat .ly map.mazemap e.seat .wxe.seat .ly .pass =true;DisplayMaze () switch (map.mazemap xy.path) case -1:;break; /墙壁图案 case 0: /空块图案= /出口路径图案/main-/主函数,迷宫求解演示int main(int argc, char* argv)下面是随机生成的迷宫: Maze mymaze; /生成迷宫按任意键演示迷宫解法! system(pause); mymaze.DoMaze ();演示结束. return 0;
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2