4644: 【GESP2409四级】黑白方块

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:1 解决:1

题目描述

小杨有一个$n$ 行$m$ 列的网格图,其中每个格子要么是白色,要么是黑色。
小杨想知道网格图中是否存在一个满足如下条件的子矩形:
子矩形由$4$ 行$4$ 列组成;
子矩形的第$1$ 行 和第$4$ 行只包含白色格子;
对于子矩形的第$2$ 行 和第$3$ 行,只有第$1$ 个和第$4$ 个格子是白色的,其余格子都是黑色的;
请你编写程序帮助小杨判断。

输入

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

输出

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

样例输入 复制

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

样例输出 复制

No
Yes
No

提示

#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";
    }
}