#abc308d. [abc308_d]Snuke Maze

[abc308_d]Snuke Maze

题目描述

我们有一个网格,有 HH 行和 WW 列。我们用 (i,j)(i,j) 来表示从上往下数第 ii 行、从左往右数第 jj 列的单元格。网格中的每个单元格上有一个小写英文字母。(i,j)(i,j) 处的字母等于给定字符串 SiS_i 的第 jj 个字符。

Snuke 将重复移动到相邻的单元格,共享一侧的单元格,从 (1,1)(1,1) 移动到 (H,W)(H,W)。判断是否存在一条路径,使得访问的单元格上的字母(包括初始的 (1,1)(1,1) 和最终的 (H,W)(H,W))按顺序为 s rightarrow\\rightarrow n rightarrow\\rightarrow u rightarrow\\rightarrow k rightarrow\\rightarrow e rightarrow\\rightarrow s rightarrow\\rightarrow n rightarrowdots\\rightarrow \\dots。这里,如果且仅当 i1i2+j1j2=1|i_1-i_2|+|j_1-j_2| = 1,则单元格 (i1,j1)(i_1,j_1) 被称为单元格(i2,j2)(i_2,j_2)的相邻单元格。

具体来说,判断是否存在一系列的单元格 ((i1,j1),(i2,j2),dots,(ik,jk))((i_1,j_1),(i_2,j_2),\\dots,(i_k,j_k)) 满足:

  • (i1,j1)=(1,1),(ik,jk)=(H,W)(i_1,j_1) = (1,1),(i_k,j_k) = (H,W)
  • 对于所有的 t(1leqt<k)t\\ (1 \\leq t < k)(it+1,jt+1)(i_{t+1},j_{t+1})(it,jt)(i_t,j_t) 的相邻单元格并且共享一侧;
  • 对于所有的 t(1leqtleqk)t\\ (1 \\leq t \\leq k)(it,jt)(i_t,j_t) 上的字母与 snuke 的第 (((t1)bmod5)+1)(((t-1) \\bmod 5) + 1) 个字符相同。

约束条件

  • 2leqH,Wleq5002\\leq H,W \\leq 500
  • HHWW 是整数。
  • SiS_i 是长度为 WW 的字符串,由小写英文字母组成。

输入

输入数据从标准输入中获取,格式如下:

HH WW S1S_1 S2S_2 vdots\\vdots SHS_H

输出

若问题描述中存在满足条件的路径,则输出 Yes,否则输出 No


示例输入 1

2 3
sns
euk

示例输出 1

Yes

路径 $(1,1) \\rightarrow (1,2) \\rightarrow (2,2) \\rightarrow (2,3)$ 满足条件,因为它们上面写着 s rightarrow\\rightarrow n rightarrow\\rightarrow u rightarrow\\rightarrow k,按照访问顺序。


示例输入 2

2 2
ab
cd

示例输出 2

No

示例输入 3

5 7
skunsek
nukesnu
ukeseku
nsnnesn
uekukku

示例输出 3

Yes