洛谷B4040 [GESP202409 四级] 黑白方块 题解

原题传送门

前言

天啊!上一周刚刚考完 \(CSP-J\) ,这一周就得去考 \(GESP\) 4级 (是的,你没有听错,我3级过了!)
所以,做了一道简单的题之后,我又来写题解了!
(仍然是WA++)

题目解析

哇,这题可真长啊!什么 (可恶的) 小杨有一个 \(n\)\(m\) 列的网格图,其中每个格子要么是白色,要么是黑色……之类的。简单总结一下:

  1. 每一个测试点里有一共 \(t\) 组数据,老规矩:用 memset() 做初始化。
  2. 每组测试数据包含:一个 \(n\)\(m\) 以及一个大小为 \(n \times m\) 的二维矩阵。
  3. 让你找是否有一个如下的连续的子矩阵 (你应该知道连续子矩阵是啥意思吧?)
0000
0110
0110
0000
  1. 如果有,输出 Yes 否则,输出 No 即可。

思路解析

这道题看似需要复杂的算法,实际上…… 看看这感人的数据规模:

对全部的测试数据,保证 \(1 \leq t\leq 10\)\(1 \leq n,m \leq 100\)

也就是说,其实只需要模拟即可通过!
即,遍历所有的可能的子矩阵起点:

for (int i = 1; i <= n - 3; i++) {
    for (int j = 1; j <= m - 3; j++) {
        if (check(i, j))
            flag = true;
    }
}

接着在 check() 函数里去判断,以 (i,j) 为起点的 \(4 \times 4\) 矩阵是否合规。

bool check(int x, int y) {
	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			if (c[i + x][j + y] != g[i][j])
				return false;
		}
	}
	return true;
}

唉,同样是2024年9月的题,3级第一题(详见)就如此难,暴力也过不了。
而4级的题目,就非常人性化!

AC Code

点击查看完整代码

#include <bits/stdc++.h>
using namespace std;
const int N = 110, M = 110;
int n, m;
int a[N][M];
int t;
int mp[4][4] = {
    {0, 0, 0, 0},
    {0, 1, 1, 0},
    {0, 1, 1, 0},
    {0, 0, 0, 0}
};

bool check(int x, int y) {
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            if (a[x + i][y + j] != mp[i][j]) {
                return false;
            }
        }
    }
    return true;
}

int main() {
    cin >> t;
    while (t--) {
        memset(a, 0, sizeof(a));
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
            string s;
            cin >> s;
            for (int j = 1; j <= m; j++) {
                a[i][j] = s[j - 1] - '0';
            }
        }
        bool flag = false;
        for (int i = 1; i <= n - 3; i++) {
            for (int j = 1; j <= m - 3; j++) {
                if (check(i, j)) {
                    flag = true;
                    break;
                }
            }
            if (flag) break;
        }
        if (flag) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
}

完结撒花!(补药再抄代码了!)

posted @ 2025-09-23 22:15  Zpy_101001  阅读(16)  评论(0)    收藏  举报