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

#include<iostream>
using namespace std;
#include <stdlib.h>
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<<"("<<p->data.x<<","<<p->data.y<<","<<p->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的位置为为墙)"<<endl;
	for(i=0;i<10;i++)
	{
		for(j=0;j<10;j++)cout<<maze[i][j]<<'\t';
		cout<<endl;
	}
	LinkList s;
	InitStack(s);
	findPath(maze,direct,s);
	cout<<endl;printStack(s);
	cout<<endl<<endl<<"迷宫完成图(0的位置未走,1的位置为为墙,-1的位置已走)"<<endl; 
	for(i=0;i<10;i++)
	{
		for(j=0;j<10;j++)cout<<maze[i][j]<<'\t';
		cout<<endl;
	}
	return 0;
}

 

  • 11
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值