用c++写一个迷宫程序

# include & ltiostream & gt

使用命名空间std

T //类定义了描述迷宫中当前位置的结构类型。

{

公共:

int x;//x表示当前位置的行坐标。

int y;//y表示当前位置的列坐标。

int dir//0:无效,1:东,2:南,3:西,4:北。

};

类链接节点//链接列表节点

{

友元类栈;

公共:

测试数据;

LinkNode * next

};

类堆栈

{

私人:

LinkNode * top//指向第一个节点的堆栈顶部指针

公共:

stack();//构造函数,空堆栈

~ Stack();//析构函数

空推(T e);//将元素数据推送到堆栈上。

t Pop();//将堆栈的顶部元素移出堆栈

t get pop();//取出堆栈的顶部元素

void Clear();//清空堆栈

布尔空();//判断堆栈是否为空,为空则返回1,否则返回0。

};

Stack::Stack() //构造函数,空栈。

{

top = NULL

}

堆栈::~Stack() //析构函数

{

}

Void Stack::Push(T e) //将元素X推送到堆栈上。

{

link node * P;

p =新LinkNode

p->;数据= e;

p->;next = top

top = P;

}

T Stack::Pop() //使栈顶元素退出栈。

{

测试温度;

link node * P;

P = top

top = top-& gt;接下来;

temp = P-& gt;数据;

删除P;

返回温度;

}

T Stack::GetPop() //取出栈顶元素。

{

返回顶部-& gt;数据;

}

Void Stack::Clear() //清空堆栈。

{

top = NULL

}

Bool Stack::empty() //判断堆栈是否为空,为空则返回1,否则返回0。

{

if(top==NULL)返回1;

否则返回0;

}

int move[4][2]={{0,1},{1,0},{0,-1},{-1,0 } };//定义当前位置要移动的四个方向。

bool Mazepath(int **maze,int m,int n);

//在迷宫中找到从(0,0)到(m,n)的路径。

//如果达到,则返回true,否则返回false。

void PrintPath(堆栈p);//输出迷宫的路径

void Restore(int **maze,int m,int n);//还原迷宫

int * * get maze(int & amp;m,int & ampn);//获得迷宫

//返回访问迷宫的二维指针。

int main()

{

int m=0,n = 0;//定义迷宫的长度和宽度。

int * *迷宫;//定义一个二维指针访问迷宫

maze=GetMaze(m,n);//调用get maze(int &;m,int & ampn)函数,获取迷宫。

If(Mazepath(maze,m,n)) //调用Mazepath(int **maze,int m,int n)函数获取路径。

cout & lt& lt“迷宫路径探索成功了!\ n ";

else cout & lt& lt“这条路不存在!\ n ";

返回0;

}

int * * get maze(int & amp;m,int & ampN)//返回一个二维指针来访问迷宫。

{

int * *迷宫;//定义一个二维指针访问迷宫

int i=0,j = 0;

cout & lt& lt"请输入迷宫的长度和宽度:";

int a,b;CIN & gt;& gta & gt& gtb;//输入迷宫的长度和宽度。

cout & lt& lt”请输入迷宫内容:\ n”;

m = a;

n = b;//m,n分别代表迷宫的行数和列数。

maze = new int *[m+2];//申请长度等于行数加2的二级指针。

for(I = 0;我& ltm+2;I++) //申请每个二维指针的空间。

{

maze[I]= new int[n+2];

}

for(I = 1;我& lt= m;I++) //输入迷宫的内容,0表示可以通行,1表示不可以通行。

for(j = 1;j & lt= n;j++)

CIN & gt;& gt迷宫[I][j];

for(I = 0;我& ltm+2;i++)

迷宫[I][0]=迷宫[I][n+1]= 1;

for(I = 0;我& ltn+2;i++)

迷宫[0][I]=迷宫[m+1][I]= 1;

返回迷宫;//返回存储迷宫的二维指针迷宫。

};

Bool迷宫路径(int * * maze,int m,int n)//在迷宫迷宫中找到从(0,0)到(m,n)的路径。

//如果达到,则返回true,否则返回false。

{

堆栈q,p;//定义栈P和Q,分别存储探索迷宫的过程和存储路径。

T Temp1,Temp2

int x,y,loop

temp 1 . x = 1;

temp 1 . y = 1;

q . Push(temp 1);//将入口位置放入堆栈

页(page的缩写)push(temp 1);

迷宫[1][1]=-1;//表示已经到达入口位置。

而(!Q.empty()) //如果栈Q不为空,则反复探索。

{

temp 2 = q . get pop();//获取堆栈的顶部元素

如果(!(p.GetPop()。x==q.GetPop()。x & amp& ampp.GetPop()。y==q.GetPop()。y))

页(page的缩写)推送(temp 2);

//如果堆栈上有一个新位置,则将最后浏览的位置存储在堆栈p中。

for(loop = 0;loop & lt4;Loop++) //浏览当前位置的4个相邻位置。

{

x = temp 2 . x+move[loop][0];//计算新位置x的位置值。

y = temp 2 . y+move[loop][1];//计算新位置的Y位置值

If(maze[x][y]==0) //判断新位置是否可达。

{

temp 1 . x = x;

temp 1 . y = y;

迷宫[x][y]=-1;//指示已经到达新位置。

q . Push(temp 1);//新位置被放入堆栈

}

if((x = =(m))& amp;& amp(y = =(n))//成功到达出口。

{

temp 1 . x = m;

temp 1 . y = n;

temp 1 . dir = 0;

页(page的缩写)push(temp 1);//将最后一个位置放入堆栈

print path(p);//输出路径

Restore(迷宫,m,n);//恢复路径

返回1;//指示路径已成功找到。

}

}

if(p.GetPop()。x==q.GetPop()。x & amp& ampp.GetPop()。y==q.GetPop()。y)

//如果堆栈上没有新位置,则返回到上一个位置。

{

页(page的缩写)pop();

q . Pop();

}

}

返回0;//表示搜索失败,即迷宫中没有路径。

}

Void PrintPath(堆栈p) //输出路径

{

cout & lt& lt”迷宫的路径是\ n”;

cout & lt& lt“括号内的内容表示为(行坐标、列坐标、数字方向、方向)\ n”;

栈t;//定义一个栈,按照入口到出口的访问路径。

int a,b;

测试数据;

LinkNode * temp

temp = new LinkNode//申请空间

temp->;data = p . Pop();//获取堆栈P的顶点元素,即第一个位置。

t.推(温度->;数据);//第一个位置放入堆栈t。

删除temp//释放空间

而(!P.empty()) //如果堆栈P不为空,则重复转移。

{

temp = new LinkNode

temp->;data = p . Pop();//获取下一个位置

//获取行走方向

a=t.GetPop()。x-temp->;data.x//线坐标方向

b=t.GetPop()。y-temp->;data.y//列坐标方向

if(a==1) temp->data . dir = 1;//向下的方向,用1表示。

else if(b = = 1)temp-& gt;data . dir = 2;//向右的方向,用2表示。

else if(a = =-1)temp-& gt;data . dir = 3;//向上的方向,用3表示。

else if(b = =-1)temp-& gt;data . dir = 4;//向左的方向,用4表示。

t.推(温度->;数据);//将新位置放到堆栈上

删除temp

}

//输出路径,包括行坐标、列坐标和下一个位置方向。

而(!T.empty()) //堆栈不为空,继续输出。

{

data = t . Pop();

cout & lt& lt(' & lt& ltdata.x & lt& lt,' & lt& ltdata.y & lt& lt,' & lt& ltdata.dir & lt& lt",";//输出行坐标和列坐标

Switch(data.dir) //输出对应的方向。

{

案例1:cout & lt;& lt" ↓) \ n ";打破;

案例2:cout & lt;& lt"→)\ n ";打破;

案例三:cout & lt& lt“↑)\ n”;打破;

案例4:cout & lt;& lt"←)\ n ";打破;

案例0:cout & lt;& lt”)\ n”;打破;

}

}

}

Void restore (int * * maze,int m,int n)//还原迷宫。

{

int i,j;

for(I = 0;我& ltm+2;I++) //遍历指针

for(j = 0;j & ltn+2;j++)

{

if(maze[I][J]=-1)//还原探索过的位置,即还原-1为0。

迷宫[I][j]= 0;

}

}

样本输出:

测试1:

请输入迷宫的长度和宽度:5 5。

请输入迷宫的内容:

0 1 1 0 0

0 0 1 1 0

1 0 0 1 1

1 0 0 1 0

1 1 0 0 0

迷宫的路径是

括号中的内容分别表示为(行坐标,列坐标,数字方向,方向)。

(1,1,1,↓)

(2,1,2,→)

(2,2,1,↓)

(3,2,1,↓)

(4,2,2,→)

(4,3,1,↓)

(5,3,2,→)

(5,4,2,→)

(5,5,0,)

迷宫路径探索成功!

测试2:

请输入迷宫的长度和宽度:9 8

请输入迷宫的内容:

0 0 1 0 0 0 1 0

0 0 1 0 0 0 1 0

0 0 0 0 1 1 0 1

0 1 1 1 0 0 1 0

0 0 0 1 0 0 0 0

0 1 0 0 0 1 0 1

0 1 1 1 1 0 0 1

1 1 0 0 0 1 0 1

1 1 0 0 0 0 0 0

迷宫的路径是

括号中的内容分别表示为(行坐标,列坐标,数字方向,方向)。

(1,1,1,↓)

(2,1,1,↓)

(3,1,1,↓)

(4,1,1,↓)

(5,1,2,→)

(5,2,2,→)

(5,3,1,↓)

(6,3,2,→)

(6,4,2,→)

(6,5,3,↑)

(5,5,2,→)

(5,6,2,→)

(5,7,1,↓)

(6,7,1,↓)

(7,7,1,↓)

(8,7,1,↓)

(9,7,2,→)

(9,8,0,)

迷宫路径探索成功!