2020 vs 2018

题目链接: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\n" << endl;
        flag = false;
    }
    return 0;
}

 

 
posted @ 2021-01-12 22:14  Carrout  阅读(130)  评论(0编辑  收藏  举报