题目描述

目前图像识别是一项非常热门的技术,最流行莫不过是深度学习,识率甚至能达到 99\% 以上。当然,对于简单的图像来说深度学习是没有必要的。比如要识别安徽拼音首字母 A和H,就可以不用深度学习就可以判断。现在有一些只含 A或者H的图像,,你知道该如何识别吗?

输入

第一行输入 正整数 T,表示数据的组。每组数据中,第一行是两个正整n和 m,$n \le 100$,$m \le 100$,表示图像的大小。接下来有 n行 ,每行m个字符,只可能为 ‘.’ 或者 ‘#’ 。‘.’ 表示白色, ‘#’ 表示黑色。 ‘#’ 会通过上下左右或者连成一个区域,表示A或H字母。
数据保证字母在图像内 ,不会有缺失。数据保证图像里只含有A或者H,且除字母外无其它黑色区域。不存在空白 图像或者含有其它内容的数据。注意,字母不一定是正着的有可能斜横或者倒。特别提示:图像一定是白底黑字的,不会存在反色情况。

输出

对于每行数据, 输出 ‘Case t: X ’,X表示你所识别出来的字母

样例输入

1
3 6
######
..#.#.
...#..

样例输出

Case 1: A

题解

#include <iostream>
#include <cstring>

using namespace std;
char a[500][500];
int n,m;
int nx[4]={0,0,1,-1};
int ny[4]={1,-1,0,0};
void dfs(int x,int y){
    a[x][y]='#';
    for (int k = 0; k <=3; k++) {
        int tx=x+nx[k];
        int ty=y+ny[k];
        if(tx<0 || tx>n+1 || ty<0 || ty>m+1 || a[tx][ty] =='#') continue;
        dfs(tx,ty);
    }
}
int main() {
    int T;
    cin>>T;
    int t=0;
    while (T--){
        t++;
        memset(a,'.', sizeof(a));
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>a[i][j];
            }
        }
        dfs(0,0);
        int flag=0;
        for(int i=0;i<=n+1;i++){
            for(int j=0;j<=m+1;j++){
                if (a[i][j]=='.'){
                    flag=1;
                    break;
                }
            }
            if(flag==1) break;
        }
        if(flag==1){
            cout<<"Case "<<t<<": A"<<endl;
        } else{
            cout<<"Case "<<t<<": H"<<endl;
        }
    }
    return 0;
}