题目背景
小林最近迷上了扫雷游戏。
题目描述
一个扫雷游戏可以被抽象成一个 n 行 m 列的字符矩阵,不妨记第 i 行第 j 列的字符为 Si,j。
若 Si,j=*,表示格子 (i,j) 上有一个地雷;
若 Si,j=?,表示格子 (i,j) 情况未知;
若 Si,j∈[0,8],表示格子 (i,j) 周围的 8 个格子中有 Si,j 个地雷(这个格子本身没有地雷)。
形式化地说,记
f(i,j)={1,0,(i,j) 上有地雷其他情况特别地,对于超出棋盘边界的情况,规定 f(i,j)=0。
则 Si,j=p=−1∑1q=−1∑1f(i+p,j+q)。
给定一个棋盘,你可以任意决定每个 ? 格子上是否有炸弹。你想要知道是否存在方案使得这个棋盘是合法的。
我们定义一个棋盘合法,当且仅当填有数字 x 的格子周围的八个格子上恰好有 x 个炸弹。
你需要解决 T 组数据。
输入格式
本题单个测试点内含多组测试数据。
第一行,一个正整数 T,代表数据组数;
对于每组数据,输入 (n+1) 行:
- 第一行,两个正整数 n,m,描述棋盘的行数和列数;
- 接下来 n 行,第 (i+1) 行的第 j 个字符描述 Si,j。
输出格式
对于每组数据,输出一行。
若存在合法的方案,输出 YES
;否则输出 NO
。
提示
对于第一组数据:问号处选择不填是一种合法方案。可以证明这是唯一的合法方案。
本题采用捆绑测试。
- Subtask 1(20pts):至多存在 1 组 (i,j),使得 Si,j=?;
- Subtask 2(80pts):无额外约束。
对于 100% 的数据,保证:
- 1≤T,n,m≤10;
- 至多存在 10 组 (i,j),使得 Si,j=?;
- ∀1≤i≤n,1≤j≤m,保证 Si,j∈{0,1,2,3,4,5,6,7,8,?,*}。