HDU4414 2012ACM/ICPC杭州赛区网络赛E Finding crosses

题目:HDU4414

小鸡动,成为兼职ACMer以来A的第一道赛题。

思路清晰,代码简洁,如下:

#include <iostream>
#include <fstream>
using namespace std;

char matrix[55][55];
int n;

inline bool check(const int& i,const int& j,char drirection)
{
	switch(drirection)
	{
	case 'h':
		if(matrix[i-1][j] != '#' && matrix[i+1][j] != '#') return true;
		return false;
	case 'z':
		if(matrix[i][j-1] != '#' && matrix[i][j+1] != '#') return true;
		return false;
	}
}

bool judge(const int& i,const int& j)
{
	int left = 0,
		right = 0,
		top = 0,
		bottom = 0;
	int t;
	t = j;
	while(t --,t >= 0 && matrix[i][t] == '#') left ++;
	if(!left) return false;
	t = j;
	while(t ++,t < n && matrix[i][t] == '#') right ++;
	if(!right || (left != right)) return false;
	t = i;
	while(t --,t >= 0 && matrix[t][j] == '#') top ++;
	if(!top || top != right) return false;
	t = i;
	while(t ++,t < n && matrix[t][j] == '#') bottom ++;
	if(!bottom || bottom != top) return false;

	//横向
	for(int k = j - left; k <= j + right; k ++)
	{
		if(k == j) continue;
		if(!check(i,k,'h')) return false;
	}
	//纵向
	for(int k = i - top ; k <= i + bottom; k ++)
	{
		if(k == i) continue;
		if(!check(k,j,'z'))	return false;
	}
	return true;
}

int main()
{
	int ans;
	while(cin>>n && n>= 3 && n<= 50)
	{		
		ans = 0;
		for(int i = 0; i < n; i ++)
		{
			scanf("%s",matrix[i]);
		}
		for(int i = 0; i < n; i ++)
			for(int j = 0; j < n ;j ++)
				if(matrix[i][j] == '#' && judge(i,j)) ans ++;
		printf("%d\n",ans);
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值