迷宫搜索
实验内容与要求
迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。
实验思路
- 由于要求用栈所以可以用深搜来做
- 先手写一个栈
- 然后dfs结束
完整代码
//
// Created by CrazyBin on 2022/2/26.
//
#include "stdio.h"
#include "stdlib.h"
int st[1010][1010];
int g[1010][1010];
int way[1010][1010];
int top=-1;
typedef struct stack{
int x[100010];
int y[100010];
} sk;
sk *s;
void init(int n,int m);
void push(int x,int y);
void pop();
int empty();
int dfs(sk *s);
int queryX();
int queryY();
int n,m;
int flag=0;
int main()
{
printf("欢迎使用小白鼠闯迷宫系统!\n");
printf("请输入迷宫的行数和列数:");
scanf("%d %d",&n,&m);
init(n,m);
printf("请输入迷宫地图:\n");
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&g[i][j]);
}
push(0,0);
st[0][0]=1;
dfs(s);
if(flag==0)
{
printf("此迷宫不通");
}
else
{
printf("到达迷宫的通路有%d条\n",flag);
printf("其中一条的轨迹如下所示:\n");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(way[i][j]==1)
printf("1");
else
printf(" ");
printf("\n");
}
}
return 0;
}
void init(int n,int m)
{
s=(sk*) malloc(sizeof (stack));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
st[i][j]=-1;
way[i][j]=-1;
}
}
int dfs(sk *s)
{
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
for(int i=0;i<4;i++)
{
int x=queryX()+dx[i],y=queryY()+dy[i];
if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==0&&st[x][y]==-1)
{
push(x,y);
st[x][y]=1;
if(st[n-1][m-1]==1)
{
flag++;
if(flag==1) {
for (int i = 0; i <= top; i++) {
int res_x = s->x[i];
int res_y = s->y[i];
way[res_x][res_y] = 1;
}
}
}
dfs(s);
st[x][y]=-1;
pop();
}
}
return 0;
}
void push(int x,int y)
{
s->x[++top]=x;
s->y[top]=y;
}
void pop()
{
top--;
}
int empty()
{
return top;
}
int queryX()
{
return s->x[top];
}
int queryY()
{
return s->y[top];
}