《B4040 [GESP202409 四级] 黑白方块》
·
题目背景
对应的选择、判断题:试题 - 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;
}
更多推荐
所有评论(0)