您的位置:首页 > 其它

hdu 5706 GirlCat(深搜)

2016-07-03 13:44 337 查看
题目链接: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.
1≤n≤1000.
1≤m≤1000.
∑(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: