#5842. 盖印章

盖印章

题目描述

给定一个 n×mn \times m 的二进制网格 grid,其中 grid[i][j] = 1 表示单元格被占用,grid[i][j] = 0 表示单元格为空白。

你有一个矩形印章,高度为 h,宽度为 w。你想用这个印章来覆盖所有空白单元格,但不能覆盖任何被占用的单元格。你可以多次盖章,印章可以重叠。

返回 true 如果可以通过盖章使所有空白单元格都被覆盖,否则返回 false

印章规则:

  • 印章必须完全在网格边界内
  • 印章覆盖的所有单元格必须都是空白(即 grid[i][j] = 0
  • 同一个位置可以多次盖章
  • 印章不能旋转 9090 度来盖章,也就是 h=2,w=3h = 2, w = 3 的印章只能覆盖高度为 22,宽度为 33 的区域,但不能覆盖高度为 33,宽度为 22 的区域。

输入格式

  • 第一行输入两个整数 n,mn, m,表示网格的行数和列数
  • 接下来 nn 行,每行 mm 个整数(0 或 1),表示 grid
  • 最后再输入两个整数 h,wh, w,表示印章的高度和宽度

输出格式

  • 输出一行:如果可以通过盖章使所有空白单元格都被覆盖,输出 true,否则输出 false

输入样例 1

5 4
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
4 3

输出样例 1

true

样例 1 解释

网格如下,其中 # 表示被占用(1),. 表示空白(0):

# . . .
# . . .
# . . .
# . . .
# . . .

印章高度 4,宽度 3。

第 1 次我们可以将印章盖在位置 (1,2),覆盖从 (1,2) 到 (4,4) 的矩形区域,此时网格会变为:

# 1 1 1
# 1 1 1
# 1 1 1
# 1 1 1
# . . .

第 2 次我们可以将印章盖在位置 (2,2),覆盖从 (2,2) 到 (5,4) 的矩形区域,此时网格会变为:

# 1 1 1
# 2 2 2
# 2 2 2
# 2 2 2
# 2 2 2

所有空白单元格都被覆盖,因此输出 true

输入样例 2

4 4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
2 2

输出样例 2

false

样例 2 解释

无论如何也无法覆盖所有空白单元格,且不超出网格边界,因此输出 false

数据范围

  • 1n,m1031 \le n, m \le 10^3
  • 1hn1 \le h \le n
  • 1wm1 \le w \le m
  • grid[i][j] 为 0 或 1