题目链接:
http://poj.org/problem?id=3923
题意描述:
输入一个n*m的屏幕
该屏幕内有至少一个对话框(每个对话框都有对应的字母表示)
判断并输出该屏幕内处于最表层的对话框是哪些(有多个的话按字典序)
解题思路:
很接近生活的一道模拟题,考察了思维的缜密性,尤其是出现嵌套情况时,应该输出里层的对话框编号即可。
AC代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char map[][];
int istop(int sx,int sy,char x); //判断是否为表层对话框函数
int main()
{
int n,m,i,j,list[],k,c;
while(scanf("%d%d",&n,&m),n+m != )
{
memset(list,,sizeof(list));
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
scanf(" %c",&map[i][j]);
if(isalpha(map[i][j]))
list[map[i][j]-'A']=;//标记有哪些字母标号的对话框出现
}
}
for(i=;i<;i++)
{
if(list[i])
{
for(j=;j<=n;j++)
{
int flag=;
for(k=;k<=m;k++)
{
if(map[j][k]-'A'==i)
{
list[i]=istop(j,k,map[j][k]);
flag=;
break;
}
}
if(flag)
break;
}
}
}
for(i=;i<;i++)
{
if(list[i])
printf("%c",'A'+i);
}
printf("\n");
}
return ;
}
int istop(int sx,int sy,char x)
{
int i,j,r,c;
i=sx;
j=sy+;
while(map[i][j] == x)
j++;
j--;
c=j;//记录该对话框的列数
if(map[i+][j] != x)
return ; while(map[i][j] == x)
i++;
i--;
r=i;//记录该对话框的行数
if(map[i][j-]!=x)
return ; while(map[i][j] == x)
j--;
j++;
if(map[i-][j]!=x)
return ; while(map[i][j] == x)
i--;
i++;
if(i!=sx &&j!=sy)
return ; for(i=sx+;i<r;i++)//判断该对话框内是否有嵌套对话框
for(j=sy+;j<c;j++)
if(map[i][j]!='.')
return ; return ;
}
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char map[][];
int istop(int sx,int sy,char x);
int main()
{
int n,m,i,j,list[],k,c;
while(scanf("%d%d",&n,&m),n+m != )
{
memset(list,,sizeof(list));
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
scanf(" %c",&map[i][j]);
if(isalpha(map[i][j]))
list[map[i][j]-'A']=;
}
}
for(i=;i<;i++)
{
if(list[i])
{
for(j=;j<=n;j++)
{
int flag=;
for(k=;k<=m;k++)
{
if(map[j][k]-'A'==i)
{
list[i]=istop(j,k,map[j][k]);
flag=;
break;
}
}
if(flag)
break;
}
}
}
for(i=;i<;i++)
{
if(list[i])
printf("%c",'A'+i);
}
printf("\n");
}
return ;
}
int istop(int sx,int sy,char x)
{
int i,j,r,c;
i=sx;
j=sy+;
while(map[i][j] == x)
j++;
j--;
c=j;
if(map[i+][j] != x)
return ; while(map[i][j] == x)
i++;
i--;
r=i;
if(map[i][j-]!=x)
return ; while(map[i][j] == x)
j--;
j++;
if(map[i-][j]!=x)
return ; while(map[i][j] == x)
i--;
i++;
if(i!=sx &&j!=sy)
return ; for(i=sx+;i<r;i++)
for(j=sy+;j<c;j++)
if(map[i][j]!='.')
return ;