题目背景

对应的选择、判断题:试题 - GESP 202409 C++ 四级 - 洛谷有题

题目描述

小杨有一个 n 行 m 列的网格图,其中每个格子要么是白色,要么是黑色。 小杨想知道网格图中是否存在一个满足如下条件的子矩形:

  • 子矩形由 4 行 4 列组成;
  • 子矩形的第 1 行和第 4 行只包含白色格子;
  • 对于子矩形的第 2 行和第 3 行,只有第 1 个和第 4 个格子是白色的,其余格子都是黑色的;

请你编写程序帮助小杨判断。

输入格式

第一行包含一个正整数 t,代表测试用例组数。
接下来是 t 组测试用例。对于每组测试用例,一共 n+1 行。
第一行包含两个正整数 n,m,含义如题面所示。
之后 n 行,每行一个长度为 m 的 01 串,代表网格图第 i 行格子的颜色,如果为 0,则对应格子为白色,否则为黑色。

输出格式

对于每组测试用例,如果存在,输出 Yes,否则输出 No。

输入输出样例

输入 #1复制

3
1 4
0110
5 5
00000
01100
01100
00001
01100
5 5
00000
01100
01110
00001
01100

输出 #1复制

No
Yes
No

说明/提示

样例 1 解释

0000
0110
0110
0000

数据规模与约定

对全部的测试数据,保证 1≤t≤10,1≤n,m≤100。

代码实现:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        int n, m;
        cin >> n >> m;
        string g[105];
        for (int i = 0; i < n; i++)
            cin >> g[i];
        bool ok = false;
        for (int i = 0; i + 3 < n; i++)
        {
            for (int j = 0; j + 3 < m; j++)
            {
                bool f = true;
                for (int p = 0; p < 4; p++)
                    if (g[i][j + p] != '0') f = false;
                for (int p = 0; p < 4; p++)
                    if (g[i + 3][j + p] != '0') f = false;
                if (g[i+1][j] != '0' || g[i+1][j+3] != '0') f = false;
                if (g[i+2][j] != '0' || g[i+2][j+3] != '0') f = false;
                for (int p = 1; p <= 2; p++)
                {
                    if (g[i+1][j+p] != '1') f = false;
                    if (g[i+2][j+p] != '1') f = false;
                }
                if (f) ok = true;
            }
        }
        cout << (ok ? "Yes" : "No") << endl;
    }
    return 0;
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐