用栈写一个迷宫老鼠的c++代码
时间: 2024-03-15 15:16:55 浏览: 105
用C++编写迷宫老鼠
好的,以下是用栈求解迷宫问题的C代码:
```
#include <stdio.h>
#include <stdlib.h>
#define ROW 10
#define COL 10
// 迷宫数组
char maze[ROW][COL] = {
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'},
{'#', ' ', ' ', ' ', '#', ' ', ' ', ' ', ' ', '#'},
{'#', ' ', '#', ' ', '#', ' ', '#', '#', ' ', '#'},
{'#', ' ', '#', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
{'#', ' ', '#', '#', '#', '#', '#', '#', ' ', '#'},
{'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#'},
{'#', ' ', '#', '#', '#', ' ', '#', '#', ' ', '#'},
{'#', ' ', '#', ' ', '#', ' ', '#', ' ', ' ', '#'},
{'#', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '#', '#'},
{'#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}
};
typedef struct
{
int r; // 行
int c; // 列
}PosType;
typedef struct
{
PosType pos; // 位置结构体
int di; // 方向
}ElemType;
typedef struct
{
ElemType data[100]; // 存储元素
int top; // 栈顶指针
}SqStack;
// 初始化栈
void InitStack(SqStack *S)
{
S->top = -1;
}
// 判断栈是否为空
int StackEmpty(SqStack S)
{
if(S.top == -1)
return 1;
else
return 0;
}
// 进栈
int Push(SqStack *S, ElemType e)
{
if(S->top == 99)
return 0; // 栈满
S->top++;
S->data[S->top] = e; // 进栈操作
return 1;
}
// 出栈
int Pop(SqStack *S, ElemType *e)
{
if(S->top == -1)
return 0; // 栈空
*e = S->data[S->top]; // 出栈操作
S->top--;
return 1;
}
// 判断迷宫中的某个位置是否可以通行
int Pass(PosType pos)
{
if(maze[pos.r][pos.c] == ' ')
return 1; // 可以通行
else
return 0; // 不可通行
}
// 判断当前位置是否为迷宫终点
int SamePos(PosType pos1, PosType pos2)
{
if(pos1.r == pos2.r && pos1.c == pos2.c)
return 1; // 当前位置为终点
else
return 0; // 当前位置不是终点
}
// 打印输出路径
void PrintPath(SqStack S)
{
int i;
printf("The path is:\n");
for(i = 0; i <= S.top; i++)
printf("(%d,%d)->", S.data[i].pos.r, S.data[i].pos.c);
printf("\n");
}
// 迷宫路径求解函数
void MazePath(PosType start, PosType end)
{
SqStack S;
InitStack(&S); // 初始化栈
PosType curpos;
curpos = start;
int curstep = 1; // 当前步数
ElemType e;
do
{
if(Pass(curpos))
{
maze[curpos.r][curpos.c] = '#'; // 表示"已经走过"
e.pos = curpos;
e.di = 1;
Push(&S, e); // 第1个方向入栈
// 如果当前位置是终点,则输出路径
if(SamePos(curpos, end))
{
PrintPath(S);
return;
}
curpos.r--; // 向左走
curstep++;
}
else
{
if(!StackEmpty(S))
{
Pop(&S, &e); // 栈顶元素出栈
while(e.di == 4 && !StackEmpty(S))
{
maze[e.pos.r][e.pos.c] = ' '; // 复原为"未走过"
Pop(&S, &e); // 这个位置所有方向已经探索完毕
}
if(e.di < 4)
{
e.di++;
Push(&S, e);
curpos = e.pos;
curpos.r += (e.di - 1) % 2;
curpos.c += e.di % 2;
}
}
}
}while(!StackEmpty(S));
}
int main()
{
PosType start = {1, 1};
PosType end = {8, 9};
MazePath(start, end);
return 0;
}
```
阅读全文