A31062. 黑白方块
填空题
较难
知识点
题目描述
黑白方块
题目描述
小杨有一个n行m列的网格图,其中每个格子要么是白色,要么是黑色。
小杨想知道网格图中是否存在一个满足如下条件的子矩形:
子矩形由4行4列组成;
子矩形的第1行和第4行只包含白色格子;
对于子矩形的第2行和第3行,只有第1个和第4个格子是白色的,其余格子都是黑色的;
请你编写程序帮助小杨判断。
输入格式
第一行包含一个正整数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
输出
No
Yes
No
满足条件的子矩形形如:
0000
0110
0110
0000
对于全部数据,保证有1≤t≤10,1≤n,m≤100。
参考答案
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int w[N][N];
int n,m;
int match[4][4];
bool check(int xa,int ya) {
for(int i=0; i<4; i++) {
for(int j=0; j<4; j++) {
if(w[xa+i][ya+j]!=match[i][j]) {
return false;
}
}
}
return true;
}
int main() {
int t;
cin>>t;
for(int i=1; i<3; i++)match[1][i]=match[2][i]=1;
while(t--) {
cin>>n>>m;
for(int i=1; i<=n; i++) {
string s;
cin>>s;
for(int j=1; j<=m; j++) {
w[i][j]=s[j-1]-'0';
}
}
int fl = 0;
for(int i=1; i<=n-3; i++) {
for(int j=1; j<=m-3; j++) {
if(check(i,j)) {
fl=1;
}
}
}
if(fl)cout<<"Yes\n";
else cout<<"No\n";
}
}
上一题
下一题