⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 labyrinth.h

📁 本程序的功能是找出指定迷宫的路径
💻 H
字号:
//程序名:labyrinth.h
//程序功能:寻找迷宫通路的实现程序
//作者:黄秋旋
//日期:2008.12.20
//版本:1.0
//修改内容:
//修改日期:
//修改作者:
//对应类实现文件: Stack.h
//对应主程序文件: labyrinth.cpp


#include<iostream.h>
#include"Stack.h"
#include<fstream.h>

#define m 6    //定义迷宫常量:m: 迷宫行数
#define n 8    //              n:迷宫列数
              
int mark[m+2][n+2];    //保存访问标记的数组
int maze[m+2][n+2];    //保存迷宫数据的数组
int move[8][2]={       //方向数组
	              {0,1},  //  向↓
	              {1,1},  //  向↘
	              {1,0},  //  向→
	              {1,-1}, // 向↗
               	  {0,-1}, // 向↑
	              {-1,-1},//向↖
	              {-1,0}, // 向←
				  {-1,1}  //  向↘
                 };               


///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//函数名:寻找迷宫路径的递归算法
//函数功能:用递归寻找迷宫的通路
//函数参数:x:当前通路位置的横坐标
//          y:当前通路位置的纵坐标
//参数返回值:true:表示当前位置可访问时的返回值
//            false: 表示查找通路失败时的返回值

bool Seekd(int x,int y)               
{
	int i;
	int g,h;
	if((x==m)&&(y==n))   //当前位置是迷宫出口时,返回上一层递归函数
		return true;
	for(i=0;i<8;i++)    
	{
		g=x+move[i][0];                     //求出下个一位置的行、列坐标
		h=y+move[i][1];
	    if((maze[g][h]==0)&&(mark[g][h]==0))
		{
			mark[g][h]=1;                    //置mark为1,表明已访问过
		    if(Seekd(g,h))
			{
			    cout<<"("<<g<<","<<h<<","<<i<<") ";  //当下一个坐标位置可访问时,输出通路
		        return true;   //返回上一层递归函数
			}//if
		}//if
	}//for
   if((x==1)&&(y==1))  //当找不到通路时,输出提示
    	cout<<"No path!"<<endl;
   return false;    //寻找通路失败,返回false
}


////////////////////////////////////////////////////////////////////////////////////////////////
//函数名:寻找迷宫路径的非递归算法
//函数功能:利用栈,找出迷宫的通路
//函数参数:无
//参数返回值:无

void Seek()                             
{ 
    Type item;
	mark[1][1]=1;   //访问入口处坐标
	Stack s;  //逆序暂存通路信息的栈
	Stack s1; //顺序存储通路信息

	item.x=1; item.y=1; item.d=-1;        //将入口位置及方向初值-1压入栈
	s.push(item);

	while(!s.empty())   //当栈不为空时
	{	
		item=s.top();  //取出栈顶元素,寻找从改坐标出发的下个一通路坐标
		s.pop();

		int x=item.x; int y=item.y; int d=item.d+1;         //沿原位置的下个一方向前进

		while(d<8)  //深度寻找迷宫通路
		{

			if((x==m)&&(y==n))          //到达出口,将栈s中的元素逆序压入栈s1中,然后从按顺序输出,最后返回
			{
				item.x=x;
	        	item.y=y;
		        item.d=NULL;
		        s1.push(item);      //将通路坐标压入栈s1
         
			    while(!s.empty())    //将栈s中的元素逆序
				{
					item=s.top();
                    s.pop();
                    s1.push(item);   
				}//while
                 while(!s1.empty())  //输出通路
				{
					item=s1.top();
                    s1.pop();
					if((item.x==m)&&(item.y==n))
						cout<<"("<<item.x<<","<<item.y<<") ";  //输出迷宫出口坐标
					else
						cout<<"("<<item.x<<","<<item.y<<","<<item.d<<") ";      //输出通路
				 }//while
			cout<<endl;
			return;  //输出完成,返回
			}//if

			int g=x+move[d][0];                  //按方向d前进,求出下一个位置的坐标
	        int h=y+move[d][1];

			if((maze[g][h]==0)&&(mark[g][h]==0))          //对未访问的可通行的下一个位置压入栈,并将下一个位置变为当前位置,否则沿下一个方向前进
	
			{
				mark[g][h]=1;  //访问标志
                item.x=x;
	        	item.y=y;
		        item.d=d;
		        s.push(item);      //将通路坐标暂存入栈s

				x=g;
	        	y=h;
		        d=0;                  //进入新位置后,重新从初始方向向下开始                   
			}//if
			else
				d++;  //试探下一个方向的坐标
		}//while
	}//while

cout<<"No path!"<<endl;      //不存在通路
}//Seek

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -