题目描述
目前图像识别是一项非常热门的技术,最流行莫不过是深度学习,识率甚至能达到 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;
}