zoukankan      html  css  js  c++  java
  • 案例6-1.4 地下迷宫探索 (30分)--深度优先遍历

     

     

     解题思路:基本方法是用深度遍历思路

    1、设y超点为a,则a入栈

    2、栈非空,寻找起点a相邻节点,

        1)超点a存在相邻最小编号b节点,则再以b为起点,重复步骤1,2

        2)若超点a不存在相邻节点,则弹出栈顶元素a后,若此时栈不空,则置下一次起点为栈顶元素c,重复步骤1,2

      解法一、

    #include <stdio.h>
    #include <malloc.h>
    #define ERROR -1
    #define MaxVex 1000+1
    #include <string.h>
    typedef enum {false,true
                 } bool;
    int G[MaxVex][MaxVex];
    int Nv,Ne;
    int visit[MaxVex]= {0};
    int Out[10000]= {0};
    typedef struct {
        int *Data;
        int Top;
        int MaxSize;
    }*Stack;
    Stack S;
    Stack CreateStack(int size) {
        Stack S=(Stack)malloc(sizeof(Stack));
        S->Data=(int *)malloc(sizeof(int)*size);
        S->MaxSize=size;
        S->Top=-1;
        return S;
    }
    
    bool IsEmpty(Stack S) {
        if(S->Top==-1)
            return true;
        return false;
    }
    bool IsFull(Stack S) {
        if(S->Top==S->MaxSize-1)
            return true;
        return false;
    }
    bool Push(Stack S,int x) {
        if(IsFull(S))
            return false;
        S->Data[++S->Top]=x;
        return true;
    }
    int Pop(Stack S) {
        if(IsEmpty(S))
            return ERROR;
        return S->Data[S->Top--];
    }
    int GetTop(Stack S) {
        if(IsEmpty(S))
            return ERROR;
        return S->Data[S->Top];
    }
    void Init() {//图初始化
        memset(G,0,sizeof(G));
        int i;
        int v1,v2;
        for(i=0; i<Ne; i++) {
            scanf("%d %d",&v1,&v2);
            G[v1][v2]=1;
            G[v2][v1]=G[v1][v2];
        }
    }
    int cnt=0,count=1;//count统计入栈顶点个数
    void NON_DFS(int k) {
        int i;
        Push(S,k);
        visit[k]=1;
        Out[cnt++]=k;
        while(!IsEmpty(S)) {
            for(i=1; i<=Nv; i++) {
                if(!visit[i]&&G[k][i]) {
                    Push(S,i);
                    count++;
                    visit[i]=1;
                    Out[cnt++]=i;
                    k=i;
                    break;
                }
            }
            if(i>Nv) {
                Pop(S);
                if(!IsEmpty(S)) {
                    k=GetTop(S);
                    Out[cnt++]=k;
                }
            }
        }
    }
    
    int main() {
        int v;
        scanf("%d %d %d",&Nv,&Ne,&v);
        int i;
        for(i=1; i<=Nv; i++) {
            visit[i]=0;
        }
        S=CreateStack(MaxVex);
        Init();
        NON_DFS(v);
        for(i=0; i<cnt; i++) {
            if(i)
                printf(" ");
            printf("%d",Out[i]);
        }
        if(count!=Nv) {
            printf(" 0");
        }
        return 0;
    }

    解法二、用数组表示栈

    #include <stdio.h>
    #include <string.h>
    #define MaxV 1000+1
    
    int G[MaxV][MaxV];
    int visit[MaxV];
    int Nv,Ne,S;
    int cnt=0;
    
    int Stack[MaxV];
    int Top=-1;
    
    void Initial() {
        int i;
        memset(G,0,sizeof(G));
        scanf("%d %d %d",&Nv,&Ne,&S);
    
        for(i=0; i<Ne; i++) {
            int v1,v2;
            scanf("%d %d",&v1,&v2);
            G[v1][v2]=1;
            G[v2][v1]=G[v1][v2];
        }
        memset(visit,0,sizeof(visit));
    }
    void DFS() {
        visit[S]=1;
        Stack[++Top]=S;
        printf("%d",S);
        cnt++;
        int i;
        while(1) {
            int flag=0;
            for(i=1; i<=Nv; i++) {
                if(!visit[i]&&G[S][i]) {
                    flag=1;
                    visit[i]=1;
                    Stack[++Top]=i;
                    cnt++;
                    printf(" %d",i);
                    S=i;
                    break;
                }
            }
            if(!flag) {
                Top--;
                if(Top==-1)
                    break;
                S=Stack[Top];
                printf(" %d",S);
            }
        }
        if(cnt!=Nv)
        printf(" 0");
        
    }
    
    int main(int argc,char **argv) {
        Initial();
        DFS();
        return 0;
    }

  • 相关阅读:
    Classification and Representation(分类与表示)
    静态链表
    拓扑序列
    二分图问题
    大数据概述
    QT出现应用程序无法正常启动0xc000007b的错误
    简易有穷自动机实验
    一个简易的C语言文法
    词法分析器实验报告
    浅谈词法分析器
  • 原文地址:https://www.cnblogs.com/snzhong/p/12511556.html
Copyright © 2011-2022 走看看