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。

这是一道简单模拟枚举题,需要把握读入的是哪一位,下标问题(也是很常见了!)。

简单来说就和没说一样,下面看代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
char a[101][101];
string s="0000011001100000";
int main(){
	int t;
	cin>>t;
	while(t--){
		int n,m;
		cin>>n>>m;
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cin>>a[i][j];
			}
		}
		if(n<4||m<4){
			cout<<"No"<<endl;
			continue;
		}
		int p=0;
		for(int i=0;i<n-4;i++){
			for(int j=0;j<m-4;j++){
			    string ss="";
				for(int x=i;x<i+4;x++){
					for(int y=j;y<j+4;y++){
						ss+=a[x][y];
					}
				}
				if(ss==s) {
					p=1;
				}
			}
		} 
		if(p==1) cout<<"Yes"<<endl;
		if(p==0) cout<<"No"<<endl;
	} 
return 0;
}

你学会了吗?(美美水题~)