HDU 5706(GirlCat)DFS or BFS

题目链接:https://vjudge.net/problem/HDU-5706

题意:输入一个N*M的图,判断里面有多少个连续的Girl和cat,可以沿上下左右四个方向。

直接DFS或BFS就行。

#include<bits/stdc++.h>
#define maxn 1000010
#define LL long long
using namespace std;
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
char mp[1010][1010];
int ans1=0,ans2=0;
int n,m;
void dfs1(int x,int y)
{
    if(mp[x][y]=='l')
    {
        ans1++;
        return ;
    }
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx<0||nx>=n||ny<0||ny>=m)
            continue;
        if(mp[x][y]=='g'&&mp[nx][ny]=='i')
        {
            dfs1(nx,ny);
        }
        if(mp[x][y]=='i'&&mp[nx][ny]=='r')
        {
            dfs1(nx,ny);
        }
        if(mp[x][y]=='r'&&mp[nx][ny]=='l')
        {
            dfs1(nx,ny);
        }
    }
}
void dfs2(int x,int y)
{
    if(mp[x][y]=='t')
    {
        ans2++;
        return ;
    }
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx<0||nx>=n||ny<0||ny>=m)
            continue;
        if(mp[x][y]=='c'&&mp[nx][ny]=='a')
        {
            dfs2(nx,ny);
        }
        if(mp[x][y]=='a'&&mp[nx][ny]=='t')
        {
            dfs2(nx,ny);
        }
    }
}
int main()
{
    int T;
    while(cin>>T)
    {
        while(T--)
        {
             cin>>n>>m;

        ans1=0,ans2=0;
        for(int i=0;i<n;i++)
        {
            cin>>mp[i];
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(mp[i][j]=='g')
                    dfs1(i,j);
                if(mp[i][j]=='c')
                    dfs2(i,j);
            }
        }
        cout<<ans1<<' '<<ans2<<endl;
        }
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/eknight123/article/details/80279271