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;
}
原文地址:https://www.cnblogs.com/scau20110726/p/2751900.html