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;
}
浙公网安备 33010602011771号