カーリングのストーンを移動させて、ゴールのマスにストーンをぴったり重ねるパズルゲームがある。詳しいルールは次のとおりである。
フィールドはH×Wのマスからなり、はじめにいくつかのマスにストーンが置かれている。 ゴールのマスは1つだけ存在して、はじめからゴールのマスにストーンが置かれていることはない。 また、フィールドは外壁で囲まれており、途中でストーンがフィールドの外へ飛び出してしまうことはない。
プレイヤーは1手ごとにストーンを1つ選び、上下左右のいずれかの方向に打ち出して滑らせることができる。 滑っているストーンは別のストーンかフィールドの外壁にぶつかるまで滑り続ける。別のストーンにぶつかった場合は、 ぶつけられた側のストーンが反動を受け、最初に打ち出した方向と同じ方向へ連鎖的に滑り出してしまう。
例えば、図1の状態でストーンAを右方向に打ち出した場合、最終的に図2のような状態になる。
このパズルのクリア条件は、フィールドに存在するストーンのいずれか1つをゴールのマスにぴったり重ねることである。ゴールのマスを通り過ぎた場合にはクリアにならない。
あなたの仕事はフィールドの初期状態を入力として受け取り、そのパズルがクリア可能かどうかを出力するプログラムを作成することである。
入力は以下の形式で与えられる。
H W F11 F12 ... F1W F21 F22 ... F2W ... FH1 FH2 ... FHW
Fijは '.' か 'o' か '@' のいずれかであり、それぞれ以下の意味を持つ。 ( 1 ≤ i ≤ H , 1 ≤ j ≤ W )
パズルがクリア可能かどうか "yes" または "no" (""は含まない)を1行に出力せよ。
1 10 o........@
yes
3 6 ...... .o..@. ......
no
6 4 .... .oo. .oo. .... .@.. ....
yes