至曾是英雄的您
题目背景
YSGHYYDS
题目描述
YSGH 有一个 $n\times m$ 的围棋棋盘,初始时,每个位置要么是空的,要么有一个黑棋棋子。**保证黑棋是连通的。**
在围棋中,一个棋子的「气」是与它相邻的所有**空**位置构成的集合。
设棋盘上第 $i$ 行第 $j$ 个位置为 $(i,j)$。
两个分别在 $(i_1,j_1)$ 和 $(i_2,j_2)$ 的**同色**棋子如果满足 $|i_1-i_2|+|j_1-j_2|=1$,就认为是相邻的,也就是在同一个连通块里。
一个连通块的「气」是这个连通块中所有棋子的「气」的并集。
白方走一步棋是合法的,当且仅当走完这手棋之后这个棋子所在连通块的「气」大于等于 $1$ 或者黑棋连通块的「气」等于 $0$。
比如下图,绿色的位置都是黑棋连通块的「气」。
![](https://cdn.luogu.com.cn/upload/image_hosting/wzrjvpox.png)
「活棋」的定义:无论对方连续走多少手棋,在每步棋都是合法的情况下,该连通块的「气」都大于等于 $1$。
请你判断这个黑棋连通块是否是「活棋」。
如果是,输出 `YES`,否则输出 `NO`。
**本题有多测。**
输入输出格式
输入格式
第一行,一个正整数 $T$,表示数据组数。
对于每组数据:
第一行,两个正整数 $n, m$,表示棋盘的大小为 $n \times m$。
接下来 $n$ 行,每行一个长度为 $m$ 的字符串。第 $i$ 行第 $j$ 个字符表示棋盘上位置为 $(i, j)$ 的地方是否有棋子。`.` 表示空格,`*` 表示黑棋子。
输出格式
如果黑棋是「活棋」,输出 `YES`,否则输出 `NO`。
输入输出样例
输入样例 #1
3
3 5
.*.*.
.***.
.....
2 5
.*.*.
.***.
6 5
.*...
.***.
**.**
*...*
**.**
*****
输出样例 #1
NO
YES
NO
输入样例 #2
1
1 3
.*.
输出样例 #2
YES
说明
**【样例解释 #1】**
第 1 组数据:
白棋依次走 $(1,1),(2,1),(3,2),(3,3),(3,4),(1,5),(2,5),(1,3)$ 即可使得黑棋连通块的「气」变成 $0$ 了。
不妨用 `@` 表示白棋,那么最终局面就是:
```plain
@*@*@
@***@
.@@@.
```
第 2 组数据:
比方说白棋先走 $(1,1)$ 那么白棋之后就再也走不到 $(1,3)$ 和 $(2,1)$ 了,导致黑棋的「气」永远大于等于 $1$,所以黑棋是「活棋」。
第 3 组数据:
最终使得黑棋连通块的「气」等于 $0$ 的局面:
```plain
@*@@.
@***@
**@**
*@.@*
**@**
*****
```
---
**【数据范围】**
**本题采用捆绑测试。**
对于 $100 \%$ 的数据,$1 \le n, m \le 2 \times {10}^3$,$1 \le T \le {10}^5$。输入的初始棋盘的每个位置要么是 `.`,要么是 `*`,并且至少有一个 `.`,至少有一个 `*`。**保证黑棋是连通的。** 保证每个测试点的 $n \times m$ 之和都小于等于 $4 \times {10}^6$。
- Subtask 1(9 points):$n = 1$。
- Subtask 2(10 points):$n = 2$,$m = 3$。
- Subtask 3(16 points):保证 `.` 的个数不超过 $7$,$n, m \le 10$,$T \le 50$。
- Subtask 4(24 points):保证 `.` 的个数不超过 $14$,$n, m \le 10$,$T \le 50$。
- Subtask 5(15 points):$n, m \ge 3$,输入局面的边界上都是 `.`。即 $\forall (i, j)$,如果 $i = 1 \lor i = n \lor j = 1 \lor j = m$,则 $(i, j)$ 一定是空地。
- Subtask 6(26 points):无特殊限制。
---
---
---
P.S. Froggy 和 uyom 都是(很久没下棋的)业余四段哥,欢迎找我们然后把我们虐一顿。