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