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

55 篇文章 0 订阅
18 篇文章 0 订阅
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<ctype.h>
#include<math.h>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
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 <class T1, class T2>inline void gmax(T1 &a, T2 b) { if (b>a)a = b; }
template <class T1, class T2>inline void gmin(T1 &a, T2 b) { if (b<a)a = b; }
const int N = 1010, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;
int casenum, casei;
int n, m;
char a[N][N];
const int dy[4] = { -1,0,0,1 };
const int dx[4] = { 0,-1,1,0 };
const char girl[5] = { "girl" };
const char cat[4] = { "cat" };
int findgirl(int y,int x,int p)
{
	if (y<1 || y>n || 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)

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值