インド式計算パズルとは n × n の格子状の升目に、横方向にも縦方向にも等式が成り立つように数字と演算子を記入していくパズルです(Figure 1 を参照して下さい)。
Figure 1
白い升には1つの数字(0から9)または演算子(+, -, ×, ÷, =)が記入され、黒く塗りつぶされた升は等式を分断します。また、いくつかの白い升にはすでに数字または演算子が記入されています。
このパズルのゴールは、与えられたリストにある数字(0から9)と演算子(+, -, ×, ÷)を全て使い、升目の空白を正しく埋めることです。
左から右、または上から下に3つ以上連続する白い升から成る文字列を等式とみなします。等式には2つの式を繋ぐただ1つの = があることが保証されています。
式は通常の四則演算の計算規則と意味論に従います。つまり、乗算・除算は加算・減算よりも優先して計算され、優先度が同じ乗算と除算及び加算と減算は左から右(上から下)の順で計算されます。また、ここでのパズルには以下の制約があります:
形式的に記述すると、等式は以下のBNFで定義された文法を満たしていなければなりません:
<Eq> ::= <Ex> = <Ex> <Ex> ::= <N0> | <Ex> <Op> <N0> <N0> ::= <N> | 0 <N> ::= <D> | <N> <D> | <N> 0 <Op> ::= + | - | × | ÷ <D> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
無論パズルの作成者は、必ず解があるものを作成しなければなりません。 あなたの仕事は、与えられたパズルが解けるかどうかを判定するプログラムを作成することです。
入力は複数のデータセットから構成されます。一つのデータセットは、以下の形式で与えられます:
H W H × W 個の文字 n n 個の文字
H, W はそれぞれ升目の縦のサイズ横のサイズを示す整数です。H × W の文字は升目を表し、空白を表す'.'、黒い升を表す'#'、数字(0から9)、演算子('+', '-', '*', '/', '=')から構成されています(×は'*'、÷は'/'として与えられることに注意して下さい)。
n はリストに含まれる数字と演算子の数を表す整数です。続く n 個の文字により空白を埋めるための数字と演算子が与えられます。
入力の終了は、N = W = 0 であるデータセットによって示されます。このケースに対して出力をしてはいけません。
各データセットに対して、パズルが解けるものであれば "Yes" と、パズルが解けないものであれば "No" と1行に出力して下さい。
5 5 4=..2 +#=#+ .-2=. =#*#= .-.=3 6 7 3 1 4 / 8 1 6 8..3=2 2 2 + 0 0
Yes No