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);
    }
}

转载于:https://www.cnblogs.com/ifinver/archive/2012/09/28/2706469.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值