hdu 5706 GirlCat(深搜)
2016-07-03 13:44
337 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5706
题目大意:根据输入的字符矩阵,分别找到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;
}
——报考杭州电子科技大学! |
GirlCatTime 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 "巴卡斯杯" 中国大学生程序设计竞赛 - 女生专场 |
解题思路:找到一个起始点,直接进行搜索,查找接下去的字母。
详见代码。
#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;
}
相关文章推荐
- 一波刚平
- Swift中switch强大的模式匹配
- Swift中switch强大的模式匹配
- Swift中switch强大的模式匹配
- javascript字符操作大全
- 10.2OraclePL_SQL数据类型
- Android 启动流程分析
- poj3669
- 面试题
- poj3984 迷宫问题 简单bfs打印路径
- ViewDragHelper简介
- 请告别对OHAttributedLabel等第三库的依赖
- web
- Apache POI 第二讲之对Excel常见操作
- Maven学习总结(21)——Maven常用的几个核心概念
- Linux 下c获取当前时间(精确到秒和毫秒或者微秒)
- Maven学习总结(21)——Maven常用的几个核心概念
- CountDownLatch、CyclicBarrier和Semaphore
- 10.1OraclePL_SQL基础&变量声明
- 4、数据类型二:Lists