迷宫问题(C++栈——回溯法)

#include
using namespace std;
#include 
typedef struct
{
	int x,y;//当前访问的迷宫格子的纵横坐标 
	int di;//当前方向编号,只能为0、1、2、3 四个方向 ,分别表示右下左上 
}Box;
typedef struct
{//x,y方向的增量
    int incX,incY; 
}Direction;
Direction direct[4]={{0,1},{1,0},{0,-1},{-1,0}};//右、下、左、上方向试探 
typedef struct LNode
 {
	Box data;
	struct LNode *next;
}LNode,*LinkList;
LinkList base,top; 
void InitStack(LinkList &s)
{//初始化栈
    s=new LNode;
	base=new LNode;
	s->next=base;
	base->next=NULL;
	top=base;
}
void push(LinkList &s,Box e)
{//将元素e压入栈顶,头插法
    LinkList p; 
	top->data=e;
	p=new LNode;
	p->next=s->next;
	s->next=p;
	top=p;
}
void pop(LinkList &s)
{//将栈顶元素出栈 
    LinkList p;
	p=top->next;
	top->next=p->next;
	delete p;
}
void getTop(LinkList s,Box &e)
{//将栈顶元素赋值给e 
	e=top->next->data;
}
void printStack(LinkList s)
{
    LinkList p = top->next;//遍历指针
    while (p!=NULL)
    {
    	cout<<"("<data.x<<","<data.y<<","<data.di<<")"<<'\t';
		p = p->next;              
    }
}
int findPath(int maze[10][10],Direction direct[4],LinkList &s)
 {
 	Box temp;
 	int x,y,di;//迷宫格子当前正在处理单元的纵横坐标和方向
	int line,col;//迷宫数组下一单元的行坐标和列坐标
	maze[1][1]=-1;//从入口出发,走过的格子赋值为-1 
	temp.x=1;temp.y=1;temp.di=-1;
	push(s,temp); 
	while(top!=NULL)//栈S不为空 
	{
		getTop(s,temp);
		x=temp.x;y=temp.y;di=temp.di+1;//从入口开始向前探索
		while(di<4)//有路可走,依次往右下左上方向探索,选定一个方向 
		{
			line=x+direct[di].incX;//下一单元的行坐标
			col=y+direct[di].incY;//下一单元的列坐标 
			if(maze[line][col]==0)//下一单元可走 
			{
				temp.x=x;temp.y=y;temp.di=di;
				push(s,temp);//该单元三元组数据入栈 
				x=line;y=col;maze[line][col]=-1;//转到下一单元,可走故赋值为-1 
				if(x==8&&y==8)//如果下一单元走到终点 
				{
					temp.x=x;temp.y=y;temp.di=-1;
					push(s,temp);//终点单元三元组数据入栈
					return 1;//走出迷宫 
				}
			    else di=0; //如果下一单元未走到终点,下一单元从右方向开始探索 
			} 
			else di++;//此方向不可走,下一个方向 
		}
		if(di==4)//无路可走,其他方向要么是墙要么被走过,这条路是死路,退回 
			pop(s);
	}
	return 0;  
 }
int main()
{
	int i,j;
    int maze[10][10]= {
	{1,1,1,1,1,1,1,1,1,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,1,0,0,0,1,0,1},
    {1,0,0,0,0,1,1,0,0,1},
    {1,0,1,1,1,0,0,0,0,1},
    {1,0,0,0,1,0,0,0,0,1},
    {1,0,1,0,0,0,1,0,0,1},
    {1,0,1,1,1,0,1,1,0,1},
    {1,1,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}};//地图
    cout<<"迷宫图(0的位置可走,1的位置为为墙)"<

迷宫问题(C++栈——回溯法)_第1张图片

 

迷宫问题(C++栈——回溯法)_第2张图片

你可能感兴趣的:(c++,算法,数据结构,蓝桥杯)