hdu 4414 Finding crosses

2334 ワード

http://acm.hdu.edu.cn/showproblem.php?pid=4414
簡単な列挙
コード:
#include <iostream>

#include <cstdio>

#include <cstring>

#include <string>

#include <queue>

#include <vector>

#include <algorithm>



#define LL long long

//#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const int N=105;

string figure[N];

int n;

bool cross(int I,int J)

{

    int k1=0,k2=0,k3=0,k4=0;

    for(int j=J+1;j<n;++j)

    {

        if(figure[I][j]=='#')

        {

            if(figure[I-1][j]=='o'&&figure[I+1][j]=='o')

            ++k1;

            else

            return false;

        }else

        break;

    }

    if(k1==0)

    return false;

    for(int j=J-1;j>=0;--j)

    {

        if(figure[I][j]=='#')

        {

            if(figure[I-1][j]=='o'&&figure[I+1][j]=='o')

            ++k2;

            else

            return false;

        }else

        break;

    }

    if(k1!=k2)

    return false;

    for(int i=I+1;i<n;++i)

    {

        if(figure[i][J]=='#')

        {

            if(figure[i][J+1]=='o'&&figure[i][J-1]=='o')

            ++k3;

            else

            return false;

        }else

        break;

    }

    if(k1!=k3)

    return false;

    for(int i=I-1;i>=0;--i)

    {

        if(figure[i][J]=='#')

        {

            if(figure[i][J+1]=='o'&&figure[i][J-1]=='o')

            ++k4;

            else

            return false;

        }else

        break;

    }

    if(k1!=k4)

    return false;

    return true;



}

int main()

{

    //freopen("data.txt","r",stdin);

    while(cin>>n)

    {

        if(n==0)

        break;

        for(int i=0;i<n;++i)

        cin>>figure[i];

        int ans=0;

        for(int i=1;i<n-1;++i)

        {

            for(int j=1;j<n-1;++j)

            {

                if(figure[i][j]=='#'&&cross(i,j))

                ++ans;

            }

        }

        cout<<ans<<endl;

    }

    return 0;

}