AT_arc040_d [ARC040D] カクカク塗り
Description
[problemUrl]: https://atcoder.jp/contests/arc040/tasks/arc040_d
イカの高橋君は床を塗るのが大好きです。床は $ N\ \times\ N $ のマス目状に区切られており、いくつか($ 0 $ 個もありうる)のマスには障害物があります。高橋君はこの床を以下のルールで塗ろうと考えています。
- 「今いるマスの床を塗って、上下左右いずれかの隣のマスに移動する」という行動を繰り返す。
- 移動するたびに向きを $ 90 $ 度回転する。すなわち、上または下に移動した直後には右または左に移動し、右または左に移動した直後には上または下に移動する。
- すでに塗ったマスには移動しない。
- マス目の外や障害物のあるマスには移動しない。
高橋君は、すでにどのマスからスタートするかを決めています。このとき、高橋君はうまく移動しながら床を塗ることで、障害物のない全てのマスを塗ることが可能でしょうか。ただし、スタート直後の移動方向や最後に塗るマスには特に指定はありません。また、最後のマスを塗った直後には移動する必要はありません。
Input Format
入力はイカの形式で標準入力から与えられる。
> $ N $ $ S_1 $ $ S_2 $ : $ S_N $
- $ 1 $ 行目には、マス目の $ 1 $ 辺の個数を表す整数 $ N\ (2\ ≦\ N\ ≦\ 400) $ が与えられる。
- $ 2 $ 行目からの $ N $ 行には、マス目の情報が与えられる。このうち $ i\ (1\ ≦\ i\ ≦\ N) $ 行目には、長さ $ N $ の文字列 $ S_i $ が与えられる。このうち $ j\ (1\ ≦\ j\ ≦\ N) $ 文字目は、$ i $ 行目 $ j $ 列目のマスの情報を以下のように表す。
- `.` の場合:このマスが床であることを表す。
- `#` の場合:このマスに障害物があることを表す。
- `s` の場合:このマスは床であり、高橋君がスタートしようと決めているマスであることを表す。
ただし、これらの文字列の中には `s` がちょうど $ 1 $ つ存在すること、`.` が少なくとも $ 1 $ つ以上存在することが保証される。
Output Format
全てのマスを塗ることが可能ならば `POSSIBLE`、そうでない場合は `IMPOSSIBLE` を $ 1 $ 行に出力せよ。出力の末尾に改行を入れること。
Explanation/Hint
### 部分点
この問題には部分点が設定されている。
- $ N\ ≦\ 50 $ を満たすデータセット $ 1 $ に正解した場合は、$ 40 $ 点が与えられる。
- 全てのテストケースに正解した場合は、上記とは別に $ 60 $ 点が与えられる。
### Sample Explanation 1
図のように移動しながら塗れば良いです。 !\[figure\](http://arc040.contest.atcoder.jp/img/arc/040/51381a54b87364aa2348975a838ef330/kaqkaq.png)