PKU 3923 Ugly Windows

問題

nxmのグリッドで表されるウィンドウの図がある。
このうち最前面にあるウィンドウを全て答えよ。

制約条件

n,m≦100

方針

出現するアルファベットについてそれぞれ最も左右上下の座標を覚えておく。
その長方形の範囲が、

  • 一辺の長さが3以上
  • 周囲はそのアルファベット
  • 内部は全て'.'

ならば、そのアルファベットのウィンドウは前面にある。

ソースコード

int h,w; char in[100][101];
int l[26],r[26],t[26],b[26];

bool ok(int c){
	if(l[c]==inf || l[c]+1>=r[c] || t[c]+1>=b[c])return 0;
	
	for(int y=t[c];y<=b[c];y++)
	for(int x=l[c];x<=r[c];x++)
	if(in[y][x]!= (y==t[c]||y==b[c]||x==l[c]||x==r[c]?'A'+c:'.'))return 0;
	
	return 1;
}

int main()
{
	while(scanf("%d%d",&h,&w),h){
		rep(i,26)l[i]=t[i]=inf, r[i]=b[i]=-1;
		
		rep(i,h){
			scanf("%s",in[i]);
			rep(j,w)if(in[i][j]!='.'){
				int c=in[i][j]-'A';
				l[c]=min(l[c],j); r[c]=max(r[c],j);
				t[c]=min(t[c],i); b[c]=max(b[c],i);
			}
		}
		
		rep(i,26)if(ok(i))printf("%c",'A'+i); puts("");
	}
	return 0;
}