• uva 784 Maze Exploration


    搜索水题,其实就是一个图的遍历(因为放在数据结构图专题中)

    给你一个图,以一整行的"_________"作为这个图的结束

    然后"X"表示不能到达,空格是能到达的,"*"也是可以到达的,并且是一个起点,要求从所有的起点出发,能到达的地方都标记为"#"

    然后输出标记后的整个图,"_______"也是要输出的

    另外注意这个图不一定是一个矩阵,可能是不规则的,例如

    XXXXXXXXX

    X   X   X

    X *     X

    X   X   X

    XXXXXXXXX

    X   X

    X   X

    X   X

    XXXXX

    _____

     

    当然这些都是没有关系的,就直接遍历好了,已经标记了"#"的点不要再访问

     

    先给出DFS代码

    #include <stdio.h>
    #include <string.h>
    #define N 35
    #define M 85
    char g[N][M];
    int n;
    int x[5]={0,-1,1,0,0} , y[5]={0,0,0,-1,1};
    void input()
    {
        int i;
        memset(g,0,sizeof(g));
        n=1;
        while(1)
        {
            gets(g[n]);
            if(g[n][0]=='_') return ;
            n++;
        }
    }
    
    void dfs(int i , int j)
    {
        int k,xx,yy;
        for(k=1; k<=4; k++)
        {
            xx=i+x[k];
            yy=j+y[k];
            if(xx>=1 && xx<=n && yy>=0 && (g[xx][yy]==' ' || g[xx][yy]=='*') )
            {
                g[xx][yy]='#';
                dfs(xx,yy);
            }
        }
    }
    
    int main()
    {
        int T,i,j;
        scanf("%d",&T); getchar();
        while(T--)
        {
            input();
    /*
            printf("^^^^^^^^^^^^^^^^^\n");
            for(i=1; i<=n; i++)
                printf("%s\n",g[i]);
    */
            for(i=1; i<=n; i++)
                for(j=0; g[i][j]!='\0'; j++)
                    if(g[i][j]=='*')
                        dfs(i,j);
    
    //        printf("bbbbbbbbbbbbbbbbbbbbbb\n");
            for(i=1; i<=n; i++)
                printf("%s\n",g[i]);
    //        printf("eeeeeeeeeeeeeeeeeeeeee\n");
        }
        return 0;
    }

    这个是BFS代码

    #include <stdio.h>
    #include <string.h>
    #include <queue>
    using namespace std;
    #define N 35
    #define M 85
    char g[N][M];
    int n;
    int x[5]={0,-1,1,0,0} , y[5]={0,0,0,-1,1};
    struct node
    {int i,j;};
    queue<struct node> q;
    
    void input()
    {
        int i;
        memset(g,0,sizeof(g));
        n=1;
        while(1)
        {
            gets(g[n]);
            if(g[n][0]=='_') return ;
            n++;
        }
    }
    
    void bfs()
    {
        int i,j,k,xx,yy;
        struct node tmp,ttmp;
        for(i=1; i<=n; i++)
            for(j=0; g[i][j]!='\0'; j++)
                if(g[i][j]=='*')
                {
                    while(!q.empty()) q.pop();
                    g[i][j]='#';
                    tmp.i=i;
                    tmp.j=j;
                    q.push(tmp);  //
                    while(!q.empty())
                    {
                        tmp=q.front();
                        q.pop();
                        for(k=1; k<=4; k++)
                        {
                            xx=tmp.i+x[k];
                            yy=tmp.j+y[k];
                            if(xx>=1 && xx<=n && yy>=0 && (g[xx][yy]==' ' || g[xx][yy]=='*') )
                            {
                                g[xx][yy]='#';
                                ttmp.i=xx;
                                ttmp.j=yy;
                                q.push(ttmp);
                            }
                        }
                    }
                }
    }
    
    int main()
    {
        int T,i,j;
        scanf("%d",&T); getchar();
        while(T--)
        {
            input();
    
            bfs();
    
    //        printf("bbbbbbbbbbbbbbbbbbbbbb\n");
            for(i=1; i<=n; i++)
                printf("%s\n",g[i]);
    //        printf("eeeeeeeeeeeeeeeeeeeeee\n");
        }
        return 0;
    }
  • 相关阅读:
    19_05_01校内训练[划分]
    19_05_01校内训练[polygon]
    [Untiy]贪吃蛇大作战(四)——游戏主界面
    [Untiy]贪吃蛇大作战(三)——商店界面
    [Untiy]贪吃蛇大作战(二)——规则界面
    [Untiy]贪吃蛇大作战(一)——开始界面
    [C#]简单的理解委托和事件
    [C#]关于override和new在重写方法时的区别
    [C#]关于逆变与协变的基本概念和修饰符in与out的意义
    [剑指Offer]剪绳子
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2751900.html
Copyright © 2020-2023  润新知