#J10020. 绘制矩形

绘制矩形

题目描述

给定一个 HHWW 列的网格。 记从上往下数第 ii 行(1iH1 \le i \le H)、从左往右数第 jj 列(1jW1 \le j \le W)的格子为 (i,j)(i, j)。 网格的状态由 HH 个长度为 WW 的字符串 S1,S2,,SHS_1, S_2, \dots, S_H 表示:

  • 如果 SiS_i 的第 jj 个字符是 #,则格子 (i,j)(i, j) 已经被涂成黑色。
  • 如果 SiS_i 的第 jj 个字符是 .,则格子 (i,j)(i, j) 已经被涂成白色。
  • 如果 SiS_i 的第 jj 个字符是 ?,则格子 (i,j)(i, j) 尚未涂色。

高桥君希望将所有尚未涂色的格子涂成白色或黑色,使得所有的黑色格子最终构成一个矩形。

更确切地说,他希望存在一个整数四元组 (a,b,c,d)(a, b, c, d)1abH,1cdW1 \le a \le b \le H, 1 \le c \le d \le W),满足:

  • 对于网格中的每个格子 (i,j)(i, j)1iH,1jW1 \le i \le H, 1 \le j \le W),如果 aiba \le i \le bcjdc \le j \le d,则该格子为黑色;
  • 否则,该格子为白色。

请判断是否能够实现这一目标。

输入格式

第一行包含两个正整数 HHWW —— 分别表示网格的行数和列数。

接下来 HH 行,每行包含一个长度为 WW 的字符串 SiS_i,表示网格的状态。

输出格式

如果可以将所有尚未涂色的格子涂色,并使黑色格子最终构成一个矩形,输出 Yes;否则输出 No

样例输入 1

3 5
.#?#.
.?#?.
?...?

样例输出 1

Yes

样例输入 2

3 3
?##
#.#
##?

样例输出 2

No

样例输入 3

1 1
#

样例输出 3

Yes

说明

样例解释

  • 对于第一个样例,初始网格如下(? 表示尚未涂色的格子):

    通过将格子 (1,3)(1, 3)(2,2)(2, 2)(2,4)(2, 4) 涂成黑色,并将 (3,1)(3, 1)(3,5)(3, 5) 涂成白色,黑色格子可以构成如下矩形:

    因此输出 Yes

  • 对于第二个样例,要使所有黑色格子构成一个矩形,必须将格子 (2,2)(2, 2) 涂成黑色,但该格子已经被涂成了白色。因此无法实现目标,输出 No

数据范围

  • 对于所有测试点,保证 1H,W10001 \le H, W \le 1000
  • 保证 SiS_i 是长度为 WW 且仅包含 #, ., ? 的字符串。
  • 保证网格中至少存在一个已经被涂成黑色的格子。
  • 保证所有的输入数值均为整数。