hdu 2487 Ugly Windows

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

 

#define MAXN 105
#define MAXH 30

struct RNode
{
    int x, y;
};

RNode rec;

int N, M;
char frame[MAXN][MAXN];
bool visited[MAXH];
bool ans[MAXH];

bool isWindow(const int R, const int C)
{
    int i, j;
    char ch = frame[R][C];

    for(i = R + 1, j = C; i < N && frame[i][j] == ch; i++) ;
    i--;
    rec.x = i;

    for(i = R, j = C + 1; j < M && frame[i][j] == ch; j++) ;
    j--;
    rec.y = j;

    for(i = rec.x, j = C + 1; j < M && frame[i][j] == ch; j++) ;
    j--;
    if(j != rec.y) return false;

    for(i = R + 1, j = rec.y; i < N && frame[i][j] == ch; i++) ;
    i--;
    if(i != rec.x) return false;

    if(rec.x - R <2 || rec.y - C < 2) return false;

    for(i = R + 1; i < rec.x; i++)
    {//中间
        for(j = C + 1; j < rec.y; j++)
        {
            if(frame[i][j] != '.')
                return false;
        }
    }

    return true;
}

void solve()
{
    memset(visited, 0, sizeof(visited));
    memset(ans, 0, sizeof(ans));

    for(int i = 0; i < N; i++)
    {
        for(int j = 0; j < M; j++)
        {
            if(frame[i][j] != '.' && !visited[frame[i][j] - 'A']) //every window has an unique ID
            {
                visited[frame[i][j] - 'A'] = true;
                if(isWindow(i, j))
                {
                    ans[frame[i][j] - 'A'] = true;
                }
            }
        }
    }

    for(int i = 0; i < 26; i++)
    {
        if(ans[i]) printf("%c", char(i + 'A'));
    }
    printf("\n");
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("indata.txt", "r", stdin);
    #endif

    while(scanf("%d %d", &N, &M), N + M)
    {
        int i;
        for(i = 0; i < N; i++) scanf("%s", frame[i]);
        solve();
    }
    return 0;
}

posted @ 2010-11-14 11:23  菜到不得鸟  阅读(192)  评论(0)    收藏  举报