原文:
http://www.zlingfly.com/2018/05/12/%E5%90%88%E5%B7%A5%E5%A4%A7OJ-1376-A-H/#more
题解
额。。。那啥。。一般情况下遇到这种题目是要用连通块的,但是这一题有些蹊跷,因为A是封闭的,也就是说用dfs搜是搜不完的,
而H能搜完。所以dfs遍历一次,如果有点没搜到,那字母就是A,反之是H。
using namespace std;
typedef long long LL;
const int maxn=110;
int ma[maxn][maxn];
int vis[maxn][maxn];
int pre[][2]={0,-1,0,1,-1,0,1,0};//前进方向的数组
int n,m;
void dfs(int x,int y);
bool check(int x,int y);//检查边界
int main(){
//freopen("in.txt","r",stdin);
int t,Case=1;
cin>>t;
while(t--){
memset(vis,0,sizeof(vis));
int i,j;
cin>>n>>m;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
char c;
cin>>c;
if(c=='.')
ma[i][j]=0;
else ma[i][j]=1;
}
}
//从两个边界点开始搜,确保所有外围都能搜到
dfs(0,0);
dfs(n+1,m+1);
int flag=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(ma[i][j]==0){
flag=1;
break;
}
}
}
if(flag){
cout<<"Case "<<Case<<": A\n";
}
else cout<<"Case "<<Case<<": H\n";
Case++;
}
return 0;
}
void dfs(int x,int y){
if(!check(x,y))return;
if(ma[x][y]==0)ma[x][y]=2;
vis[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+pre[i][0];
int yy=y+pre[i][1];
if(!check(xx,yy))continue;
dfs(xx,yy);
}
}
bool check(int x,int y){
if(x<0||x>n+1||y<0||y>m+1||ma[x][y]==1||vis[x][y])
return false;
else return true;
}