| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 430 人关注过本帖
标题:迷宫问题,大家帮我修改下!!!
只看楼主 加入收藏
l3315534
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-12-28
结帖率:50%
收藏
 问题点数:0 回复次数:0 
迷宫问题,大家帮我修改下!!!
#define ok 1
#define error 0
#define overflow -1
#define size sizeof(struct Sqlist)
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

//自己建立一个迷宫
/*int Creat(int migong[8][8])
{
    //建立一个迷宫,其中只有0和1,1表示墙0表示通道
    //定义一个二维数组
    int i,j;
    printf("现在请你建立自己的迷宫,输入 64个数字:"\n)
    for (i=0;i<8;i++)
        for(j=0;j<8;j++)
            scanf("%d",&migong[8][8]);
        //输出迷宫
        for(i=0;i<8;i++)
            for(j=0;j<8;j++)
                printf("%2d",migong[8][8]);
}*/


//由于当你走错路时必须按原路返回,所以必须先后进先出。所以我们在这里定义栈元素类型
typedef struct MStackElem{
    //在这里把迷宫的墙和通道在二维空间中定义坐标方便表示
    int x;    //x坐标表示上下
    int y;   //y坐标表示左右
    int val; //migong[x][y]的值
}MStackElem;

//栈的定义
typedef struct Sqlist{
    MStackElem *top;
    MStackElem *base;
    int stacksize;
}Sqlist;
//构建一个空栈
int InitStack(Sqlist *S)
{
    S->base=(MStackElem*)malloc(STACK_INIT_SIZE*sizeof(size));//开辟一个空间
    if(!S->base)exit(overflow);
    S->top=S->base;
    S->stacksize=STACK_INIT_SIZE;
    return ok;
}
MStackElem getTop(Sqlist *s){
if (s->top == s->base) {//判断栈是否为空,
   printf("in getTop(),empty stack! exit now. ");
   exit(error);
}
else {
   return *(s->top - 1);
}
}

int Push(Sqlist *S,MStackElem e)
{
    if(S->top-S->base>=S->stacksize){
        //如果栈满了,我们在这里追加存储空间
    S->base=(MStackElem*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(int));
    S->top=S->base+S->stacksize;
    S->stacksize+=STACKINCREMENT;
    }
    *S->top++=e;
    return ok;
}
//删除栈顶元素
int Pop(Sqlist &S)
{
    if(S.top==S.base)return error;
    *--S.top;
    return ok;
}

//下面就是关于走出迷宫的具体操作
//构建两个栈,一个保存探索路径,一个保存可以走出去的路径
Sqlist way,realway;


//判断位置以前是否走过
int unPass(Sqlist way,MStackElem ls)
{
    int flag=1;//先设置flag=1,如果已经走过了就变为0
    while(way.top!=way.base)
    {
        MStackElem e=*(way.top-1);
        if(e.x==ls.x&&e.y==ls.y)
          {
              flag=0;
          }
     (way.top)--;
    }
    return flag;
}
//从东面开始走
MStackElem ESET(MStackElem ls)
{
    if(ls.y!=7){//当y==7的时候由于到达了迷宫边界就不能在走动了
        ls.y++;//在坐标上向右走的情况
        ls.val=migong[ls.x][ls.y];
    }
    return ls;
}
//想南面走的情况
MStackElem SOUTH(MStackElem ls)
{
    if(ls.x!=7){
       ls.x++;
        ls.val=migong[ls.x][ls.y];
    }
    return ls;
}
//向西面走的情况
MStackElem WEST(MStackElem ls)
{
    if(ls.x!=0){
        ls.x--;//在坐标中向左走
        ls.val=migong[ls.x][ls.y];
    }
    return ls;
}
//获得北面的位置
MStackElem getNorth(MStackElem ls)
{
    if(ls.y!=0){
        ls.y--;//在坐标上向下走的情况
        ls.val=migong[ls.x][ls.y];
    }
    return ls;
//做进一步的尝试
MStackElem getNext(MStackElem ls)
{
    MStackElem next;
    next.x=next.y=next.val=-1;
   if(ESET(ls).val!=0&&unPass(way,ESET(ls))){//如果没通过则向其他方向走走看
      next=ESET(ls);
    }
    else if(SOUTH(ls).val!=0&&unPass(way,SOUTH(ls))){
      next=SOUTH(ls);
    }
    else if(WEST(ls).val!=0&&unPass(way,WEST(ls))){
      next=WEST(ls);
    }
    else if(getNorth(ls).val!=0&&unPass(way,getNorth(ls))){
      next=getNorth(ls);
    }
   return next;  //如果都已经走过,则返回-1
}
//得出迷宫的路径
int getMazeWay()
{
    MStackElem start,end,ls;
    start.x=0;
    start.y=0;//开始的时候是从入口开始
    start.val=migong[start.x][start.y];//开始路径
    end.x=7;
    end.y=7;
    end.val=migong[end.x][end.y];//结束路径


    ls=start;//设定入口位置

    do{
        if(unPass(way,ls)){//如果当前位置为走到时
            Push(&realway,ls);
            Push(&way,ls);
            ls=getNext(ls);
            if(start.x==end.x&&start.y==end.y){
                //已经到达出口,跳出循环
              Push(&realway,ls);
              Push(&way,ls);
             return true;
            }
            else if(ls.val==-1){//当四面都是障碍物或者都已经走过
           //删除栈顶元素
           Pop(realway);
          ls=getTop(&realway);
       }
       else{   //说明以前的方向都不对,现在尝试其他方向
           ls=getNext(ls);
           if(ls.val==-1){
           Pop(realway);
           ls=getTop(&realway);
           }
       }
    }while(ls.x!=end.x&&ls.y!=end.y);
}
void printlujing(Sqlist *S)
{
    MStackElem e;
    while(S->base<S->top-1){
        e=*(S->base);
        printf("migong[%d][%d]------>:",e.x,e.y);
        (S->base)++;
    }
    e=*(S->base);
        printf("migong[%d][%d]........\n恭喜你,你已成功走出迷宫!",e.x,e.y);
}

int main()
{
    InitStack(&way);
    InitStack(&realway);
    huodelujing();
    printf("The path of through the maze is:\n\n");
    printlujing(&realway);
    return 0;
}
我想自己输入迷宫,但是不知道怎么回事,不能成功!!大家修改下我的代码吧
搜索更多相关主题的帖子: 迷宫 
2010-06-22 17:32
快速回复:迷宫问题,大家帮我修改下!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024149 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved