|
发表于 2023-7-29 21:20:38
|
显示全部楼层
不用担心,我来帮助你解决这个问题。
你的代码已经接近正确的解决方向,但在检查 Tak Code 条件时存在一些错误。让我们来修正这个问题。另外,你还需要修改代码以确保滑动窗口覆盖所有可能的 9x9 区域。
以下是修改后的代码:
- #include <bits/stdc++.h>
- using namespace std;
- int n, m, a[1200][1200];
- char c[1200][1200];
- bool isTakCode(int i, int j) {
- // 检查左上角和右下角的 3x3 区域是否满足条件
- if (a[ i][j] && a[ i][j + 1] && a[ i][j + 2] &&
- a[i + 1][j] && a[i + 1][j + 1] && a[i + 1][j + 2] &&
- a[i + 2][j] && a[i + 2][j + 1] && a[i + 2][j + 2] &&
- a[i + 6][j + 6] && a[i + 6][j + 7] && a[i + 6][j + 8] &&
- a[i + 7][j + 6] && a[i + 7][j + 7] && a[i + 7][j + 8] &&
- a[i + 8][j + 6] && a[i + 8][j + 7] && a[i + 8][j + 8])
- {
- // 检查与左上角或右下角 3x3 区域相邻的 14 个格子是否满足条件
- for (int x = i - 1; x <= i + 9; x++) {
- for (int y = j - 1; y <= j + 9; y++) {
- if (x >= 1 && x <= n && y >= 1 && y <= m) {
- if (x < i || x > i + 2 || y < j || y > j + 2) {
- if (a[x][y])
- return false;
- }
- }
- }
- }
- return true;
- }
- return false;
- }
- int main() {
- cin >> n >> m;
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= m; j++) {
- cin >> c[ i][j];
- if (c[ i][j] == '#')
- a[ i][j] = 1;
- }
- }
- for (int i = 1; i <= n - 8; i++) {
- for (int j = 1; j <= m - 8; j++) {
- if (isTakCode(i, j)) {
- cout << i << ' ' << j << endl;
- }
- }
- }
- return 0;
- }
复制代码
在修改后的代码中,我们引入了一个名为 isTakCode 的函数来检查给定的 9x9 区域是否满足 Tak Code 条件。该函数首先检查左上角和右下角的 3x3 区域是否都是黑色,然后再检查与这两个区域相邻的 14 个格子是否都是白色。如果这两个条件都满足,那么这个 9x9 区域就符合 Tak Code 的条件。
然后,我们在主函数中使用滑动窗口遍历整个网格,并调用 isTakCode 函数来检查每个可能的 9x9 区域是否符合要求,并输出满足条件的区域的左上角坐标。
希望这可以帮助你解决紧急的问题!如果你有任何疑问,请随时询问。 |
|