【2016杭电女生赛1005】【暴力 bfs or dfs or 模拟】girlcat 数女生数和猫咪数

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template inline void gmin(T1 &a, T2 b) { if (bn || x<1 || x>m)return 0;
	if (a[y][x] != girl[p])return 0;
	if (p == 3)return 1;
	int ret = 0;
	for (int i = 0; i < 4; ++i)ret += findgirl(y + dy[i], x + dx[i], p + 1);
	return ret;
}
int findcat(int y, int x, int p)
{
	if ( y<1 || y>n || x<1 || x>m )return 0;
	if (a[y][x] != cat[p])return 0;
	if (p == 2)return 1;
	int ret = 0;
	for (int i = 0; i < 4; ++i)ret += findcat(y + dy[i], x + dx[i], p + 1);
	return ret;
}
void solve()
{
	scanf("%d", &casenum);
	for (casei = 1; casei <= casenum; ++casei)
	{
		scanf("%d%d", &n, &m);
		for (int i = 1; i <= n; ++i)scanf("%s", a[i] + 1);
		int girlnum = 0;
		int catnum = 0;
		for (int i = 1; i <= n; ++i)
		{
			for (int j = 1; j <= m; ++j)
			{
				girlnum += findgirl(i, j, 0);
				catnum += findcat(i, j, 0);
			}
		}
		printf("%d %d\n", girlnum, catnum);
	}
}
int main()
{
	solve();
	return 0;
}
/*
【吐槽】
这题是我自己出的一道蠢笨的题目>_<
因为老师说,需要一道简单偏难度的题目,让大家都能尽量试着写出来。
(本来出了2道脑洞题,因为老师没开放自主出题权,所以只留下了这个最笨拙的题T_T)

【题意】
我们拍了一张照片!
照片是n*m个像素的!
对于每个像素,都是一个小写英文字符。
如果连着走4步,是"girl"就是一个girl
如果连着走3步,是"cat"就是一只cat
然后问你,这个图上有多少个girl多少只cat

【类型】
简单bfs or dfs

【分析】
显然,如果你很熟练的话,只要暴力枚举起点,然后做记录匹配阶段的暴力dfs或者bfs即可。
然而,这题的友好之处,在于——
它给并不会算法的人,提供了一个用汗水交换丰收=w=的机会。
你只要写一串for,或者一大通if!就可以顺利获得一个AC啦!
for(i)for(j)
if(a[i][j]=='g')
{
	if(a[i-1][j]=='l')
	{
		if(...)
	}
	if(a[i+1][j]=='l')
	{
		if(...)
	}
	if(a[i][j-1]=='l')
	{
		if(...)
	}
	if(a[i][j+1]=='l')
	{
		if(...)
	}
}
就这样 = = 
23333

【时间复杂度&&优化】
O(Tnm)

*/

你可能感兴趣的:(题库-HDU,搜索-dfs,暴力)