栈的应用_迷宫求解

原创 2012年03月22日 18:36:47
标题: 迷宫问题
时 限: 100000 ms
内存限制: 100000 K
总时限: 3000 ms
描述:
迷宫问题
迷宫是一个二维矩阵,其中1为墙,0为路,3为入口,4为出口.要求从入口开始,从出口结束,按照 下,左,上,右 的顺序来搜索路径.
输入:
迷宫宽度w 迷宫高度h
迷宫第一行
迷宫第二行
...
迷宫第h 行
输出:
入口横坐标1 入口纵坐标1
横坐标2 纵坐标2
横坐标3 纵坐标3
横坐标4 纵坐标4
...
横坐标n-1 纵坐标n-1
出口横坐标n 出口纵坐标n
输入样例:
8 10
1 1 1 1 1 1 1 1
1 0 1 1 0 1 0 1
1 0 1 0 0 1 0 1
1 1 0 3 1 0 1 1
1 0 0 1 0 0 4 1
1 0 0 0 0 1 1 1
1 0 1 0 0 1 0 1
1 0 1 0 0 0 1 1
1 1 1 1 0 0 0 1
1 1 1 1 1 1 1 1
输出样例:
3 3
2 3
2 4
2 5
3 5
3 6
3 7
4 7
4 6
4 5
4 4
5 4
6 4
//编译器G++
#include <stdio.h>
#include <stdlib.h>
#define InitStackSize 1000
#define SizeIncrease 100

typedef struct
{
int x;
int y;

}PosType;


typedef struct
{
int ord;
PosType seat;
int di;
}SElemType;


typedef struct sqStack
{
    SElemType *top;
    SElemType *base;
    int stacksize;
}sqStack;


//initial stack
int InitStack(sqStack *s)
{
    s->base=(SElemType*)malloc(InitStackSize*sizeof(SElemType));
    s->top=s->base;
    s->stacksize=InitStackSize;
    return 0;
}


//push
int Push(sqStack *s,SElemType e)
{
    if(s->top-s->base>=s->stacksize)//stack is full,realloc
    {
        //printf("realloc\n");
        s->base=(SElemType*)realloc(s->base,(s->stacksize+SizeIncrease)*sizeof(SElemType));
        s->top=s->base+s->stacksize;
        s->stacksize=s->stacksize+SizeIncrease;
    }
    *(s->top)=e;
    s->top++;
    return 0;
}

//pop
SElemType pop(sqStack *s)
{
    SElemType temp;
    s->top--;
    temp=*(s->top);
    return temp;
}


//gettop
SElemType gettop(sqStack *s)
{
    return *(s->top-1);
}


//isempty
int isempty(sqStack *s)
{
    if(s->top==s->base)
    return 1;
    else
    return 0;
}


//Traverse
//int StackTraverse(sqStack *s)
//{
//SElemType *p=s->top;
////printf("该栈自顶向下的元素为:\n");
//while(p!=s->base)
//{
//p--;
////cout<<*p<<endl;
//printf("(%d %d)",p->seat.y,p->seat.x);
//}
//printf("\n");
//return 0;
//}

void printffrombase(sqStack *s)
{
    SElemType *p=s->base;
    while(p!=s->top)
    {
        printf("%d %d\n",p->seat.x,p->seat.y);
        p++;
    }
}



int Pass(int **Maze,PosType pos)
{
	if(Maze[pos.y][pos.x]!=1)
	return 1;
	return 0;
}



void Footprint(int **Maze,PosType pos)
{
    //pos->walked=1;
    Maze[pos.y][pos.x]=1;
}

void Markprint(int **Maze,PosType pos)
{
    Maze[pos.y][pos.x]=1;
}

PosType NextPos(PosType curpos,int di)
{
    if(di==1)
    {
        curpos.y=curpos.y+1;
    }
    if(di==2)
    {
        curpos.x=curpos.x-1;
    }
    if(di==3)
    {
        curpos.y=curpos.y-1;
    }
    if(di==4)
    {
        curpos.x=curpos.x+1;
    }
    return curpos;

}

int main()
{
    int width,height;
    scanf("%d%d",&width,&height);

	//动态分配迷宫的宽和高
	int **Maze;
	Maze=(int **)malloc(sizeof(int*)*height);
	Maze[0]=(int *)malloc(sizeof(int)*height*width);
	int i;
	for(i=1;i<height;i++)
	{
		Maze[i]=Maze[i-1]+width;
	}
   //获取迷宫各位置的值
    int temp;
    for (i=0;i<height;i++)
    {
        int j;
        for(j=0;j<width;j++)
        {
            scanf("%d",&temp);
            //setPos(&pos[i][j],j,i,temp);
            Maze[i][j]=temp;
        }
    }

sqStack *stack=(sqStack*)malloc(sizeof(sqStack));
InitStack(stack);
PosType curpos,start,end;

int j;
for(i=0;i<height;i++)
{
    for(j=0;j<width;j++)
    {
        if(Maze[i][j]==3)
        {
            start.x=j;
            start.y=i;
        }
    }
}
for(i=0;i<height;i++)
{
    for(j=0;j<width;j++)
    {
        if(Maze[i][j]==4)
        {
            end.x=j;
            end.y=i;
        }
    }
}

int curstep=1;
curpos=start;
do
{
    if(Pass(Maze,curpos))
    {
        Footprint(Maze,curpos);
        SElemType e;
        e.ord=curstep;
        e.seat=curpos;
        e.di=1;
        Push(stack,e);

        if(curpos.x==end.x&&curpos.y==end.y)
        {
            //printf("12\n");
            printffrombase(stack);
            return 0;
        }
        curpos=NextPos(curpos,1);
        curstep++;
    }//if pass
    else
    {
        //printf("nopass\n");
        if(!isempty(stack))
        {
            SElemType e=pop(stack);
            while(e.di==4 && !isempty(stack))
            {
                Markprint(Maze,e.seat);
                e=pop(stack);
            }//while
            if(e.di<4)
            {
                e.di++;
                Push(stack,e);
                curpos=NextPos(e.seat,e.di);
            }//if
        }//if
    }//else
}while(!isempty(stack));
return 1;
}


数据结构:栈的应用(迷宫的求解)

/********************************************************** 程序:迷宫实现 作者:小单 完成时间:2013年...
  • s634772208
  • s634772208
  • 2015年05月08日 13:55
  • 853

数据结构(7)—栈的应用之迷宫求解

参考书籍:数据结构(C语言版)严蔚敏吴伟民编著清华大学出版社 1.问题描述: 采用“穷举求解”方法,从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路返回,换一个方向再继续探索。为...
  • u010366748
  • u010366748
  • 2016年02月21日 01:23
  • 902

栈求解迷宫问题

问题:假设下图是某迷宫的地图,问此迷宫是否有一条通路 求解思想: 用栈来实现解决问题,主要步骤是 (1)从迷宫的...
  • xyzbaihaiping
  • xyzbaihaiping
  • 2016年04月11日 23:16
  • 3315

应用栈求解迷宫问题(C++实现)

栈是数据结构中一种重要的线性结构,限定仅在表尾进行插入和删除操作的线性表,因此我们也可以认为它是一种特殊的线性表。由于栈的这个特点,我们又可以称其为后进先出的结构。如图所示:650) this.wid...
  • JulyShuofeng
  • JulyShuofeng
  • 2016年06月03日 13:15
  • 2761

以栈解决迷宫问题

怎么找到一个迷宫的出口呢。首先要知道迷宫长啥样,之后知道出入口,再之后就是找通路的过程了。     显然主要的部分是如何找通路。我们就举一个例子:     在这个迷宫中0就是墙,1就是路...
  • A_stupid_dog
  • A_stupid_dog
  • 2016年06月23日 16:23
  • 3318

运用栈求解迷宫问题C/C++

用栈解决基本的迷宫问题C/C++ 1、问题描述:设置迷宫为m*n的二维数组,起点坐标为(1,1),中点坐标为(m,n),0为通路,1为死路,为防止数组越界将四周设置边界1,即数组变为(m+2)*(n...
  • g15827636417
  • g15827636417
  • 2016年10月07日 16:18
  • 4865

C++栈实现数据结构中的迷宫求解

利用顺序栈实现数据结构中的迷宫求解问题 首先初始化一个二维数组vector>,将障碍物标记为-1,为走过的点标记为0,走过的点标记为1 从入口地址开始,依次按上下左右四个方向寻找是否有可以通行的点,如...
  • longjingwen12345
  • longjingwen12345
  • 2016年11月25日 12:47
  • 1296

利用堆栈实现迷宫问题的求解

的说法是
  • meiyubaihe
  • meiyubaihe
  • 2014年06月07日 10:47
  • 1253

用栈和队列求解迷宫问题

1:①、定义一个顺序栈;     ②、编写走出迷宫代码;     ③、编写主函数。 1、栈: #include #include #include #include #define MaxSize ...
  • xdf0101
  • xdf0101
  • 2015年12月26日 20:38
  • 1656

数据结构--用栈求解迷宫问题(非最优解)

数据结构第四版p79页迷宫问题我觉得存在BUG,下图盗用贺老师就会的QAQ,也希望贺老师能看到帮忙解答一下啦。 BUG:  程序从起始点(1,1)开始寻找路径,在当前点进行判断其上下左右是否存在可走点...
  • huangyong000
  • huangyong000
  • 2016年05月09日 18:57
  • 3553
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:栈的应用_迷宫求解
举报原因:
原因补充:

(最多只允许输入30个字)