题目描述
我们有一个网格,有 H 行和 W 列。我们用 (i,j) 来表示从上往下数第 i 行、从左往右数第 j 列的单元格。网格中的每个单元格上有一个小写英文字母。(i,j) 处的字母等于给定字符串 Si 的第 j 个字符。
Snuke 将重复移动到相邻的单元格,共享一侧的单元格,从 (1,1) 移动到 (H,W)。判断是否存在一条路径,使得访问的单元格上的字母(包括初始的 (1,1) 和最终的 (H,W))按顺序为 s
rightarrow n
rightarrow u
rightarrow k
rightarrow e
rightarrow s
rightarrow n
rightarrowdots。这里,如果且仅当 ∣i1−i2∣+∣j1−j2∣=1,则单元格 (i1,j1) 被称为单元格(i2,j2)的相邻单元格。
具体来说,判断是否存在一系列的单元格 ((i1,j1),(i2,j2),dots,(ik,jk)) 满足:
- (i1,j1)=(1,1),(ik,jk)=(H,W);
- 对于所有的 t(1leqt<k),(it+1,jt+1) 是 (it,jt) 的相邻单元格并且共享一侧;
- 对于所有的 t(1leqtleqk), (it,jt) 上的字母与
snuke
的第 (((t−1)bmod5)+1) 个字符相同。
约束条件
- 2leqH,Wleq500
- H 和 W 是整数。
- Si 是长度为 W 的字符串,由小写英文字母组成。
输入
输入数据从标准输入中获取,格式如下:
H W
S1
S2
vdots
SH
输出
若问题描述中存在满足条件的路径,则输出 Yes
,否则输出 No
。
示例输入 1
2 3
sns
euk
示例输出 1
Yes
路径 $(1,1) \\rightarrow (1,2) \\rightarrow (2,2) \\rightarrow (2,3)$ 满足条件,因为它们上面写着 s
rightarrow n
rightarrow u
rightarrow k
,按照访问顺序。
示例输入 2
2 2
ab
cd
示例输出 2
No
示例输入 3
5 7
skunsek
nukesnu
ukeseku
nsnnesn
uekukku
示例输出 3
Yes