AT_utpc2011_4 停止問題

题目描述

Defunge 程序由一个 $R$ 行 $C$ 列的字符数组组成。下面是一个 Defunge 程序的例子: ```plain 6>--v. .^--_@ ``` Defunge 程序从程序的左上角(即第一行第一列)开始执行。**它的执行方向一开始为"右"**,每次朝着执行方向走一步,**如果走出界了,要跳到另一边**。每走到一个格子上,就要执行这个格子上的命令。 Defunge 程序还有一个存储器,这个存储器只能存储 $[0,15]$ 的一个整数,**存储器一开始存储** $\bold{0}$。 在 Defunge 程序中,有且只有 $11+10=21$ 种命令,下面是它们各自的含义: - ``:把执行方向设置为"右"。 - `^`:把执行方向设置为"上"。 - `v`:把执行方向设置为"下"。 - `_`:如果存储器存储的数字是 $0$,就把执行方向设置为"右",否则设置为"左"。 - `|`:如果存储器存储的数字是 $0$,就把执行方向设置为"下",否则设置为"上"。 - `?`:把执行方向设置为"上下左右"中的**任意**一个(类似于 dfs 把四个方向全搜一遍)。 - `.`:什么也不做。 - `@`:停止程序。 - `0`-`9`:把存储器设置为这个字符表示的数值。 - `+`:让存储器的数值加 $1$。注意当存储器的数值为 $15$ 时要把它设为 $0$。 - `-`:让存储器的数值减 $1$。注意当存储器的数值为 $0$ 时要把它设为 $15$。 现在,给你一个 Defunge 程序,请判断这个程序是否能停止(即执行到命令`@`)。如果能,输出`YES`,否则输出`NO`。

输入格式

输出格式

说明/提示

$1\leq R,C\leq 20$,保证程序里只有上文提到的 $21$ 种命令。