求解迷宫算法 迭代法

不是我写的,好好学习一下

研究了一下,觉得是这样

1。 这个栈S1用来保存到这个点所最近一次查找过的方向信息。

      所以每个点第一次入栈时方向都是-1,表示这个点还没有进行过搜索。

      而每个点出栈后,d都要加一,表示我们要去找这个点的下一个方向。

2。 栈S1里面保存的就是搜索的路径。

      根据代码中的这个算法,我们遇到一个可以往下找的点时,会将当前的点入栈。 然后以找到的新点为起点。

      所以,当我们进入下一次的循环后,栈S1的栈顶元素就是这次查找路径到达本点的上一个点。

      以此类推,栈顶的第二个元素就是第一个元素的前继。

      ok,那么栈的元素,就是这次查找的路径。

 

/*
 * =====================================================================================
 *
 *       Filename:  maze.c
 *
 *    Description: 
 *
 *        Version:  1.0
 *        Created:  09/26/2010 07:20:53 AM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (),
 *        Company: 
 *
 * =====================================================================================
 */
#include<stdio.h>
#include<stdlib.h>
#define M 16
#define N 16
typedef struct mark//¶šÒåÃÔ¹¬ÄÚµãµÄ×ø±êÀàÐÍ
{
    int x;
    int y;
}mark;

typedef struct Element//"Áµ"Õ»ÔªËØ£¬ºÙºÙ¡£¡£
{
    int x,y; //xÐÐ,yÁÐ
    int d; //dÏÂÒ»²œµÄ·œÏò
}Element;

typedef struct LStack //ÁŽÕ»
{
    Element elem;
    struct LStack *next;
}LStack, *PLStack;

/*************Õ»º¯Êý****************/
int InitStack(PLStack &S)//¹¹Ôì¿ÕÕ»
{
    S=NULL;
    return 1;
}

int StackEmpty(PLStack S)//ÅжÏÕ»ÊÇ·ñΪ¿Õ
{
    if(S==NULL)
        return 1;
    else
        return 0;
}

int Push(PLStack &S, Element e)//ѹÈëÐÂÊýŸÝÔªËØ
{
    PLStack p;
    p=(PLStack)malloc(sizeof(LStack));
    p->elem=e;
    p->next=S;
    S=p;
    return 1;
}

int Pop(PLStack &S,Element &e) //Õ»¶¥ÔªËسöÕ»
{
    PLStack p;
    if(!StackEmpty(S))
    {
        e=S->elem;
        p=S;
        S=S->next;
        free(p);
        return 1;
    }
    else
        return 0;
}

/***************ÇóÃÔ¹¬Â·Ÿ¶º¯Êý***********************/
void MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2])
{
    int i,j,d;int a,b;
    Element elem,e;
    PLStack S1, S2;
    InitStack(S1);
    InitStack(S2);
    maze[start.x][start.y]=2; //Èë¿Úµã×÷ÉϱêŒÇ
    elem.x=start.x;
    elem.y=start.y;
    elem.d=-1; //¿ªÊŒÎª-1
    Push(S1,elem);
    while(!StackEmpty(S1)) //Õ»²»Îª¿Õ ÓзŸ¶¿É×ß
    {
        Pop(S1,elem);
        i=elem.x;
        j=elem.y;
        d=elem.d+1; //ÏÂÒ»žö·œÏò
        while(d<4) //ÊÔÌœ¶«ÄÏÎ÷±±ž÷žö·œÏò
        {
            a=i+diradd[d][0];
            b=j+diradd[d][1];
            if(a==end.x && b==end.y && maze[a][b]==0) //Èç¹ûµœÁ˳ö¿Ú
            {
                elem.x=i;
                elem.y=j;
                elem.d=d;
                Push(S1,elem);
                elem.x=a;
                elem.y=b;
                elem.d=886; //·œÏòÊä³öΪ-1 ÅжÏÊÇ·ñµœÁ˳ö¿Ú
                Push(S1,elem);
                printf("/n0=E 1=S 2=W 3=N 886 means out of maze/n/npath is:(x,y,d)/n");
                while(S1) //ÄæÖÃÐòÁÐ ²¢Êä³öÃÔ¹¬Â·Ÿ¶ÐòÁÐ
                {
                    Pop(S1,e);
                    Push(S2,e);
                }
                while(S2)
                {
                    Pop(S2,e);
                    printf("-->(%d,%d,%d)",e.x,e.y,e.d);
                }
                return; //Ìø³öÁœ²ãÑ­»·£¬±ŸÀŽÓÃbreak,µ«·¢ÏÖ³öŽí£¬exitÓÖ»áœáÊø³ÌÐò£¬Ñ¡ÓÃreturn»¹ÊDz»ŽíµÎo(¡É_¡É)o...
            }
            if(maze[a][b]==0) //ÕÒµœ¿ÉÒÔÇ°œøµÄ·Ç³ö¿ÚµÄµã
            {
                maze[a][b]=2; //±êŒÇ×ß¹ýŽËµã
                elem.x=i;
                elem.y=j;
                elem.d=d;
                Push(S1,elem); //µ±Ç°Î»ÖÃÈëÕ»
                i=a; //ÏÂÒ»µãת»¯Îªµ±Ç°µã
                j=b;
                d=-1;
            }
            d++;
        }
    }
    printf("no path for this maze/n");
}


/*************œšÁ¢ÃÔ¹¬*******************/
void initmaze(int maze[M][N])
{
    int i,j;
    int m,n; //ÃÔ¹¬ÐÐ,ÁÐ

    printf("column m=");
    scanf("%d",&m);
    printf("cow n=");
    scanf("%d",&n);
    printf("/ninput your maze:/nseperate by space,0 path,1 wall/n",m,n);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&maze[i][j]);
    printf("creating your maze...o(¡É_¡É)o.../n");
    for(i=0;i<=m+1;i++) //ŒÓһȊΧǜ
    {
        maze[i][0]=1;
        maze[i][n+1]=1;
    }
    for(j=0;j<=n+1;j++)
    {
        maze[0][j]=1;
        maze[m+1][j]=1;
    }
    for(i=0;i<=m+1;i++) //Êä³öÃÔ¹¬
    {
        for(j=0;j<=n+1;j++)
            printf("%d ",maze[i][j]);
        printf("/n");
    }
}

int maze[][16] =
{
            /*0 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15  */
    /*  0 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    /*  1 */{1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    /*  2 */{1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    /*  3 */{1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    /*  4 */{1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1},
    /*  5 */{1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1},
    /*  6 */{1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1},
    /*  7 */{1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1},
    /*  8 */{1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1},
    /*  9 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1},
    /* 10 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
    /* 11 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
    /* 12 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
    /* 13 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
    /* 14 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
    /* 15 */{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

int main()
{
    int sto[M][N];
    int i,j;
    struct mark start,end; //start,endÈë¿ÚºÍ³ö¿ÚµÄ×ø±ê
    int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//ÐÐÔöÁ¿ºÍÁÐÔöÁ¿ ·œÏòÒÀŽÎΪ¶«Î÷Äϱ±

//    initmaze(sto);//œšÁ¢ÃÔ¹¬

    for(i=0;i<16;i++) //Êä³öÃÔ¹¬
    {
        for(j=0;j<16;j++)
            printf("%d ",maze[i][j]);
        printf("/n");
    }
    printf("start point, sperate by comma/n");
    scanf("%d,%d",&start.x,&start.y);
    printf("ent point, sperate by comma/n");
    scanf("%d,%d",&end.x,&end.y);

//    MazePath(start,end,sto,add); //find path
    MazePath(start,end,maze,add); //find path
    printf("/n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值