CF508A Pasha and Pixels 题解

Content

有一个 \(n\times m\) 的矩阵,一开始全部格子被染成白色。 接下来有 \(k\) 个操作,每一个操作表示把一个格子染成黑色。问第一次出现 \(2\times 2\) 的全部涂成黑色的矩阵是第几个操作,或者没有出现这样的矩阵。

数据范围:\(1\leqslant n,m\leqslant 1000,1\leqslant k\leqslant 10^5\)。

Solution

我们可以边涂黑边判断,假设现在将 \((x,y)\) 涂成黑色。那么,出现一个 \(2\times 2\) 的全部涂成黑色的矩阵只会有 \(4\) 种情况:

  1. \((x,y),(x-1,y),(x,y-1),(x-1,y-1)\) 全部涂成黑色。
  2. \((x,y),(x+1,y),(x,y-1),(x+1,y-1)\) 全部涂成黑色。
  3. \((x,y),(x-1,y),(x,y+1),(x-1,y+1)\) 全部涂成黑色。
  4. \((x,y),(x+1,y),(x,y+1),(x+1,y+1)\) 全部涂成黑色。

只要满足上面四种情况中的任意一种,直接输出答案结束。否则,操作全部执行完毕还是没有出现,输出 \(0\)。

Code

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;

int n, m, k, a[1007][1007];

bool check1(int x, int y) {
	return a[x][y] && a[x - 1][y] && a[x][y - 1] && a[x - 1][y - 1];
}
bool check2(int x, int y) {
	return a[x][y] && a[x + 1][y] && a[x][y - 1] && a[x + 1][y - 1];
}
bool check3(int x, int y) {
	return a[x][y] && a[x - 1][y] && a[x][y + 1] && a[x - 1][y + 1];
}
bool check4(int x, int y) {
	return a[x][y] && a[x + 1][y] && a[x][y + 1] && a[x + 1][y + 1];
}

int main() {
	scanf("%d%d%d", &n, &m, &k);
	for(int i = 1; i <= k; ++i) {
		int x, y;
		scanf("%d%d", &x, &y);
		a[x][y] = 1;
		if(check1(x, y) || check2(x, y) || check3(x, y) || check4(x, y))
			return printf("%d", i), 0;
	}
	return printf("0"), 0;
}
上一篇:零碎知识笔记


下一篇:docker 部署nacos