hdu 5706 GirlCat(深搜)

Posted qiqi_starsky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5706 GirlCat(深搜)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5706

GirlCat

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 132    Accepted Submission(s): 104


Problem Description
As a cute girl, Kotori likes playing ``Hide and Seek‘‘ with cats particularly.
Under the influence of Kotori, many girls and cats are playing ``Hide and Seek‘‘ together.
Koroti shots a photo. The size of this photo is n×m, each pixel of the photo is a character of the lowercase(from `a‘ to `z‘).
Kotori wants to know how many girls and how many cats are there in the photo.

We define a girl as -- we choose a point as the start, passing by 4 different connected points continuously, and the four characters are exactly ``girl‘‘ in the order.
We define two girls are different if there is at least a point of the two girls are different.
We define a cat as -- we choose a point as the start, passing by 3 different connected points continuously, and the three characters are exactly ``cat‘‘ in the order.
We define two cats are different if there is at least a point of the two cats are different.

Two points are regarded to be connected if and only if they share a common edge.
 

Input
The first line is an integer T which represents the case number.

As for each case, the first line are two integers n and m, which are the height and the width of the photo.
Then there are n lines followed, and there are m characters of each line, which are the the details of the photo.

It is guaranteed that:
T is about 50.
1n1000.
1m1000.
(n×m)2×106.
 

Output
As for each case, you need to output a single line.
There should be 2 integers in the line with a blank between them representing the number of girls and cats respectively.

Please make sure that there is no extra blank.

 

Sample Input
3 1 4 girl 2 3 oto cat 3 4 girl hrlt hlca
 

Sample Output
1 0 0 2 4 1
 

Source
 

题目大意:根据输入的字符矩阵,分别找到girl和cat字符串的数量。

解题思路:找到一个起始点,直接进行搜索,查找接下去的字母。

详见代码。

#include <iostream>
#include <cstdio>

using namespace std;

char Map[1010][1010];
char ans[2][10]= {{"cat"},{"girl"}};
int dir[4][2]= {0,1,0,-1,1,0,-1,0}; //4行2列
int n,m,s1,s2;

void dfs(int x,int y,int flag,int num)//flag用来标记我当前找的字符串是cat还是girl,num用来表示当前找到了是第几个字符。
{
    if (flag==1)//girl
    {

        if (num==3)//找到了girl的长度就加加
        {
            s1++;
            return;
        }
        for (int i=0; i<4; i++)
        {
            int X=x+dir[i][0];
            int Y=y+dir[i][1];
            if (X>=0&&X<n&&Y>=0&&Y<m&&(Map[X][Y]==ans[flag][num+1]))//一个字符一个字符比较,看是否为我接下去要找的那个字符
            {
                dfs(X,Y,1,num+1);
            }
        }
    }
    if (flag==0)
    {
        if (num==2)
        {
            s2++;
            return;
        }
        for (int i=0; i<4; i++)
        {
            int X=x+dir[i][0];
            int Y=y+dir[i][1];
            if (X>=0&&X<n&&Y>=0&&Y<m&&(Map[X][Y]==ans[flag][num+1]))
            {
                dfs(X,Y,0,num+1);
            }
        }
    }
}

int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        s1=s2=0;
        scanf("%d%d",&n,&m);
        for (int i=0; i<n; i++)
        {
            scanf("%s",Map[i]);
        }
        for (int i=0; i<n; i++)
        {
            for (int j=0; j<m; j++)
            {
                if (Map[i][j]=='g')
                    dfs(i,j,1,0);
                if (Map[i][j]=='c')
                    dfs(i,j,0,0);
            }
        }
        printf ("%d %d\n",s1,s2);
    }
    return 0;
}


以上是关于hdu 5706 GirlCat(深搜)的主要内容,如果未能解决你的问题,请参考以下文章

hdu5706-GirlCat

HDU - 5706 - Girlcat - 简单搜索 - 有新手都可以看懂的详解

HDU-5706-GirlCatBFS2016CCPC女生专场

HDU2228栈深搜树哈希/同构

HDU 2717 深搜第一题

HDU-1016 Prime Ring Problem(DFS深搜+打表)