题目链接:https://ac.nowcoder.com/acm/contest/9699/B
题目描述:
Bobo有一副 n 行 m 列,只包含 '.' 和 'o' 两种字符的字符画,其中 '.' 是背景,'o' 画出了2018或者2020。请识别给出的字符画是2018还是2020的。
输入描述:
输入文件包含多组数据,请处理到文件结束。
每组数据的第一行包含两个整数 n 和 m,接下来的 n 行每行包含 m 个字符表示字符画。
· 1 ≤ n, m ≤ 50
· 数据组数不超过 100.
· 字符画
·· 只包含 '.' 和 'o' 两种字符;
·· 只会是2018或者2020的字符画;
·· 不同数字的字符 'o' 不会(在8个方向上)相邻
·· 壁画都是水平或者竖直的,但是大小和位置都可能任意出现。
输出描述:
对于每组数据,如果给出的字符画是2020,输出2020,否则输出2018。
示例:
输入:
6 14
..............
.oo.ooo.oo.ooo
..o.o.o..o.o.o
.oo.o.o.oo.o.o
.o..o.o.o..o.o
.oo.ooo.oo.ooo
6 14
....ooo....ooo
.oo.o.o..o.o.o
..o.o.o..o.ooo
.oo.o.o..o.o.o
.o..ooo..o.o.o
.oo......o.ooo
11 12
ooo...ooo...
o.o.....o...
ooo...ooo...
......o.....
ooooo.o.ooo.
o...o.o...o.
o...o.ooo.o.
o...o.....o.
o...o...ooo.
o...o...o...
ooooo...ooo.
输出:
2020
2018
2020
题目解析:
2020和2018的区别就在于8的不同(如图所示)
假定上图为一个长11宽3的二维数组a。黄色,红色部分为'o'。白色部分为‘.’。上图表示一个8再图中的储存方式。
那么如图所示的a[3][6]的上面,左边和下面这些地方一定存有元素'o'。
由于题目已经限定不同数字之间都会有分割,所以 0 1 2 一定不会出现这种结构。
所以只需要遍历整个二维数组,找出a[p][q]=='o'&&a[p][q-1]=='o'&&a[p-1][q]=='o'&&a[p+1][q]=='o'为真就能确定画出的图为2018还是2020。
同理:
如下结构同样能够判别‘8’(蓝色部分)
代码如下:
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); int num1, num2, all; bool flag = false; char a[55][55]; while (cin >> num1 >> num2) { memset(a, 0, sizeof(a)); for (int z = 1;z <= num1;z++) for (int k = 1;k <= num2;k++) cin >> a[z][k]; for (int p = 1;p <= num1;p++) for (int q = 1;q <= num2;q++) if (a[p][q] == 'o' && a[p][q + 1] == 'o' && a[p - 1][q] == 'o' && a[p + 1][q] == 'o') { flag = true; break; } if (flag) cout << "2018" << endl; else cout << "2020 " << endl; flag = false; } return 0; }