数据结构之用栈实现迷宫问题(dfs)

给一个n*n的方格,让你求从左上角到所给一点的任意一条路径并输出

该题用到dfs,以下是对dfs的简要解析  :详解请参见 传送门

dfs是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

下面上代码:

#include
#include
#define M 8
#define N 8
#define Maxn 100
using namespace std;
int mg[M+2][N+2];
typedef struct {
    int i,j,di;
}Box;
typedef struct {
    Box data[Maxn];
    int top;
}StType;
bool Push(StType* &s,Box e){
//    if(s->top==Maxn-1){
//        return false;
//    }
    s->top++;
    s->data[s->top]=e;
    return true;
}
void Init(StType *&s){
    s=(StType*)malloc(sizeof(StType));
    s->top=-1;
}
bool Pop(StType *&s,Box &e){
    if(s->top==-1){
        return false;
    }
    e=s->data[s->top];
    s->top--;
    return true;
}
bool GetTop(StType *s,Box &e){
    if(s->top==-1)
        return false;
    e=s->data[s->top];
    return true;
}
bool StackEmpty(StType *s){
    return (s->top==-1);
}
void Destroy(StType* &s){
    free(s);
}
bool mgpath(int xi,int yi,int xe,int ye){
    Box path[Maxn],e;
    int i = 0,j = 0,di,i1 = 0,j1 = 0,k;
    bool find;
    StType * st;
    e.i=xi;
    e.j=yi;
    e.di=-1;
    Init(st);
    Push(st,e);
    mg[xi][yi]=-1;
    while(!StackEmpty(st)){
        GetTop(st, e);
        i=e.i;j=e.j;di=e.di;
        if(i==xe&&j==ye){
            printf("迷宫路径如下:\n");
            k=0;
            while(!StackEmpty(st)){
                Pop(st,e);
                path[k++]=e;
            }
            while (k>=1) {
                k--;
                printf("(%d,%d)   ",path[k].i,path[k].j);
                if((k+2)%5==0 )
                    printf("\n");
            }
        
            printf("\n");
            Destroy(st);
            return true;
        }
    
        find=false;
        while(di<4&&!find){
            di++;
            switch (di) {
                case 0:i1=i-1;j1=j; break;
                case 1:i1=i;j1=j+1; break;
                case 2:i1=i+1;j1=j; break;
                case 3:i1=i;j1=j-1; break;
            }
            if(mg[i1][j1]==0){
                find=true;
            }
        }
            if(find){
                st->data[st->top].di=di;
                e.i=i1;e.j=j1;e.di=-1;
                Push(st,e);
                mg[e.i][e.j]=-1;
            }
            else{
                Pop(st,e);
                mg[e.i][e.j]=0;
            }
    }
    Destroy(st);
    return false;
}

int main(){
    int n,i,j;
    printf("请输入地图:\n");
    scanf("%d",&n);
    for(i=0;i

 

你可能感兴趣的:(搜索)