题目描述
目前图像识别是一项非常热门的技术,最流行莫不过是深度学习,识率甚至能达到 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 2 3 4 5
| 1 3 6 ###### ..#.#. ...#..
|
样例输出
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #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; }
|