前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >迷宫问题的简单栈实现

迷宫问题的简单栈实现

作者头像
glm233
发布2020-09-28 10:31:59
6790
发布2020-09-28 10:31:59
举报
文章被收录于专栏:glm的全栈学习之路

问题描述:

以一个n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

对于本问题需用栈实现“穷举求解”算法,即:从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。加入所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。迷宫数据是一个n阶矩阵用二维数组存储,起点为(1,1),终点为(n,n),再在迷宫外围加上一层围墙(默认为1,不需用户输入,用户只需输入迷宫数据即可),对于迷宫中每个数据都有四个方向可通。

代码语言:javascript
复制
#include<malloc.h>
#include<bits/stdc++.h>
#define N 10
using namespace std;
typedef struct Dot
{
    int x,y;
}Dot;
typedef Dot DATA_TYPE;
typedef struct Maze
{
    Dot init,the_end;
    int map[N][N];
}Maze;
typedef struct
{
	DATA_TYPE *data;
	int top;//此处的top意为当前手打栈的容量,capacity意为最大承载量
	int capacity;
}Stack;
int n;bool vis[N][N],flag;
int dx[4]={-1,1,0,0},dy[4]={0,0,1,-1};
int InitStack(Stack* s,int size)
{
	s->data = (DATA_TYPE*)malloc(size*sizeof(DATA_TYPE));

	if(s->data == NULL) //如果空间动态非配出错,就报错
		return 0;

	s->capacity = size;
	s->top = 0;
	return 1;
}

int IsFull(Stack* s)
{
	if(s->top >= s->capacity)return 1;
	else return 0;
}

int IsEmpty(Stack *s)
{
	if(s->top <= 0)return 1;
	else return 0;
}


int Push(Stack *s ,DATA_TYPE d)
{
	if(IsFull(s))return 0;
	else
	{
		s->data[s->top++]=d;
		return 1;
	}
}

int Pop(Stack* s,DATA_TYPE *d)
{
	if(IsEmpty(s))
		return 0;
	else
	{
		s->top--;
		*d=s->data[s->top];
		return 1;
	}
}

int GetTop(Stack*s,DATA_TYPE *d)
{
	if(IsEmpty(s))return 0;
	else
	{
		*d = s->data[s->top-1];
		return 1;
	}
}

int ClearStack(Stack* s)
{
	s->top=0;
	return 1;
}

int DestoryStack(Stack* s)
{
	free(s->data) ;
	s->top=-1;
	s->capacity=-1;
	return 1;
}
Maze Maze_init(Maze *M)//迷宫初始化
{
	scanf("%d",&n);
	for (int i = 1;i <=n;i++)
	{
		for (int j = 1;j <=n;j++)
		{
			scanf("%d",&M->map[i][j]);
		}
	}
	M->init={1,1},M->the_end={n,n};
	return *M;
}
inline bool ok(Dot current,Maze *M)
{
    if(current.x<1||current.y<1||current.x>n||current.y>n||vis[current.x][current.y]||M->map[current.x][current.y]==0)
    {
       // cout<<(current.x<1||current.y<1||current.x>n||current.y>n)<<endl;
        /*cout<<vis[current.x][current.y]<<endl;
        cout<<M->map[current.x][current.y]<<endl;*/
        return false;
    }
    return true;
}
inline void print_stack(Stack *p)
{
    flag=1;
    while(!IsEmpty(p))
    {
        Dot temp;
        Pop(p,&temp);
        cout<<temp.x<<" "<<temp.y<<endl;
    }
}
inline void find_path(Maze *M,Dot current,Stack *p)
{
    //cout<<current.x<<" "<<current.y<<endl;
    if(current.x==n&&current.y==n)
    {
        print_stack(p);
        return;
    }
    //cout<<ok(current,M)<<endl;
    if(!ok(current,M))return ;
    int tempx=current.x,tempy=current.y;
    vis[tempx][tempy]=1;
    Push(p,current);
    for(int i=0;i<4;i++)
    {
        Dot k=current;
        k.x+=dx[i],k.y+=dy[i];
        find_path(M,k,p);
    }
    Pop(p,&current);
    return ;
}
inline void work()
{
    Maze M;
    Stack p;
    InitStack(&p,(N+5)*(N+5) );
    M=Maze_init(&M);
    Dot current=M.init;
    //cout<<current.x<<" "<<current.y<<endl;
    find_path(&M,current,&p);
    if(!flag)cout<<-1<<endl;
}

int main()
{
   work();
   return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档