天天看点

问题 K: A?H?

题目描述

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

输入

第一行输入 正整数 TT,表示数据的组。每组数据中,第一行是两个正整nn和 mm,n≤100n≤100,m≤100m≤100,表示图像的大小。接下来有 nn行 ,每行mm个字符,只可能为 ‘.’ 或者 ‘#’ 。‘.’ 表示白色, ‘#’ 表示黑色。 ‘#’ 会通过上下左右或者连成一个区域,表示AA或HH字母。

数据保证字母在图像内 ,不会有缺失。数据保证图像里只含有AA或者HH,且除字母外无其它黑色区域。不存在空白 图像或者含有其它内容的数据。注意,字母不一定是正着的有可能斜横或者倒。特别提示:图像一定是白底黑字的,不会存在反色情况。

输出

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

样例输入复制

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

样例输出复制

Case 1: A      
#include<iostream>
#include<cstring>
#include <queue>

using namespace std;
const int maxn = 100 + 2;
char map[maxn][maxn];
int dx[4] = {1, 0, 0, -1};
int dy[4] = {0, -1, 1, 0};
int n, m;

struct Point
{
    int x,y;
};

void BFS(int x, int y)
{
    queue<Point> q{};
    q.push({x,y});
    while(!q.empty())
    {
        Point p=q.front();
        q.pop();
        for(int k=0;k<4;k++)
        {
            int nx=p.x+dx[k];
            int ny=p.y+dy[k];
            if(nx<0||nx>n+2||ny<0||ny>m+2||map[nx][ny]=='#')continue;
            q.push({nx,ny,});
            map[nx][ny]='#';
        }
    }
}


int main()
{
    int T;
    cin >> T;
   for(int t=1;t<=T;t++)
   {
        cin >> n >> m;
        memset(map, '.', sizeof(map));
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                cin >> map[i][j];
        BFS(0, 0);
        bool flag = false;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if(map[i][j]=='.')
                {
                    flag=true;
                    break;
                }
            }
            if(flag)break;
        }
        if (flag)printf("Case %d: A\n",t);
        else printf("Case %d: H\n",t);
    }
    return 0;
}
           

继续阅读