HDU 2487

//HDU 2487注意完全包围等情况
#include <iostream>
#include <cstdio>
#include <queue>
#include <string>
#include <cstring>
#include <algorithm>

using namespace std;
const int NMAX=101;
char wmap[NMAX][NMAX];

bool isTop( char id, int start, int n, int m )
{
    int si=start/m, sj=start%m;
    int i, j;
    //cout<<si<<" "<<sj<<" "<<id<<endl;
    for( i=si; i<n && wmap[i][sj]==id; ++i ) ;
    for( j=sj; j<m && wmap[si][j]==id; ++j ) ;
    i--;
    j--;
    if( i-si<2 || j-sj<2 )
        return false;
    for( int k=sj; k<=j; ++k )
        if( wmap[i][k]!=id )
            return false;
    for( int k=si; k<=i; ++k )
        if( wmap[k][j]!=id )
            return false;
    for( int k=si+1; k<i; ++k )
        for( int p=sj+1; p<j; ++p )
        {
            if( wmap[k][p]!='.' )
                return false;
        }
    return true;
}

int main()
{
    freopen("in.txt","r",stdin);

    int n, m; 
    int point[30];
    while( scanf("%d%d",&n, &m) && (n||m) )
    {
        memset(point,0xff,sizeof(point));
        for( int i=0; i<n; ++i )
        {
            scanf("%s",wmap[i]);
            for( int j=0; wmap[i][j]!=0; ++j )
            {
                if( wmap[i][j]!='.' && point[wmap[i][j]-'A']<0 )
                {
                    point[wmap[i][j]-'A']=i*m+j;
                }
            }
        }
        for( int i=0; i<26; ++i )
        {
            if( point[i]>=0 )
            {
                if( isTop(i+'A',point[i],n,m) )
                {
                    printf("%c",'A'+i);
                }
            }
        }
        printf("\n");
    }
    return 0;
}


//HDU 2587 对数据进行排序后,从数组两端开始查找,如果num[b]+num[e]<k则b向前,若相等,处理,否则e向后.注意等值数.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX=100010;
int main()
{
    freopen("in.txt","r",stdin);
    int T;
    int n, k;
    int num[MAX];
    scanf("%d",&T);
    while( T-- )
    {
        scanf("%d%d",&n,&k);
        for( int i=0; i<n; ++i )
            scanf("%d",&num[i]);
        sort(num, num+n);
        int b=0, e=n-1;
        bool B=false, E=false;
        int ans=0;
        while( b<=e )
        {
            if( num[b]+num[e]==k )
            {
                if( num[b]!=num[e] )
                    ans+=2;
                else
                {
                    ans++;
                    break;
                }
                b++;
                e--;
                B=E=true;
            }
            else if( num[b]+num[e]<k )
            {
                ++b;
                B=true;
            }
            else if( num[b]+num[e]>k )
            {
                --e;
                E=true;
            }
            if( B==true )
            {
                while( num[b]==num[b-1] )
                    ++b;
                B=false;
            }
            if( E==true )
            {
                while( num[e]==num[e+1] )
                    --e;
                E=false;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
//HDU 2266 枚举题,处理有点麻烦
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;
long long Data[13][13];
int State[13];
long long Val, Num;
int Len;

void init( char* p )
{
    for( int i=0; i<Len; ++i )
    {
        Data[i][i]=*(p+i)-'0';
        long long t=10;
        for( int j=i+1; j<Len; ++j, t*=10 )
        {
            Data[i][j]=Data[i][j-1]*10+*(p+j)-'0';
        }
    }
}

long long calc( int b, int e )
{
    for( int i=b+1; i<=e; ++i )
    {
        if( State[i]!=0 )
        {
            return calc(b,i-1)+calc(i, e);
        }
    }
    return Data[b][e]*(State[b]==1?1:-1);
}

void solve( int nowpos )
{
    if( nowpos>=Len )
    {
        if( calc(0,Len-1)==Val )
            Num++;
        return;
    }
    for( int i=0; i<3; ++i )
    {
        State[nowpos]=i;
        solve( nowpos+1 );
    }
}

int main()
{
    freopen("in.txt","r",stdin);
    char str[20];
    State[0]=1;
    while( cin>>str>>Val )
    {
        Num=0;
        Len=strlen(str);
        init(str);
        solve(1);
        cout<<Num<<endl;
    }
    return 0;
}


posted on 2010-10-03 00:32  Kenfly  阅读(322)  评论(0编辑  收藏  举报