栈的应用_迷宫求解

原创 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;
}


相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

郁闷,本来搞一下午想隆重推出“二维栈模拟打印杨辉三角滴”,无奈失败,缅怀一下

最近貌似感冒,吼吼;明天不开电脑了,看看书,远离电脑,珍惜生命~~~

POJ3494--Largest Submatrix of All 1's(二维栈)

题目大意:给出一个m*n的01矩阵,求由1组成的最大矩形 分析:这题也是栈的运用,只不过,现在是二维的,所以,我们要先转换成一维。 首先,我们可以一排一排的计算,而每一排每一个矩形的宽都是...

栈的应用——迷宫求解问题

/* 利用栈求解迷宫问题(只输出一个解,算法3.3) */ typedef struct /* 迷宫坐标位置类型 */ { int x; /* 行值 */ int y; /* 列值 ...

重温数据结构-栈的应用:进制转换,括号匹配检测,行编辑,迷宫求解,求表达式的值

1.括号匹配检测,行编辑,迷宫求解代码 /* * $filename: MyStackApplication.java,v $ * $Date: 2014-3-11 $ * Copyright...

求解:栈的应用 深度优先搜索:迷宫问题

假设迷宫是一个n行n列的二维平面表格,左上角作为迷宫的入口,右下角作为迷宫的出口。 例如:可以用一个10×10的矩阵maze[10][10]来表示四周为墙的8×8迷宫,矩阵的元素为0或1,0表示通路...

栈的应用举例——迷宫求解

迷宫求解思路(求出所有的从入口到出口的路径): do {    若当前位置可通    则 { 则将当前位置插入栈顶; 留下足迹; 若该位置是出口 则 {输出该成功出逃的路径; ...

迷宫求解——栈的简单应用

要熟练得掌握一种数据结构,要经过大量的练习,而将数据结构应用于实际用用中则是一种非常好的锻炼方式。 此次便是应用java来实现 迷宫求解 这个经典的程序设计问题。 迷宫如上图所示,其中,'...

6.栈的应用-迷宫求解

在许多游戏程序中有自动寻路的功能,自动寻路包括

java 栈的实现以及栈的典型应用--字符平衡,中缀转后缀,后缀计算,迷宫求解等

栈是一种顺序存储的数据结构,具有先入后出的特点。栈的实现方式主要有两种,分别是用链表来实现和用数组来实现。 栈虽然看起来很简单,但是用处却很多,最典型的举几个例子:字符平衡(几种括号的表达式的平衡)、...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:栈的应用_迷宫求解
举报原因:
原因补充:

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