プログラム作成試験

【使用言語】
自由。
あなたの好みと、この試験問題を解くのに適しているかどうかで言語を選択してください。
そのプログラム言語で標準的に使用可能なクラスライブラリ(Javaならjava.util.*のクラス群、C++ならSTL、等)は自由に使ってください。

【制限時間】 
３時間（早くできれば高評価です）
時間を経過しても完全に動作しない場合でも、その時点のものを提出してください。
１時間以内にできた場合は、採用に向けてかなり大きなアドバンテージになります。

【問題】
　ゲーム「倉庫番」のような（あるいは、ドラクエの初期のころの洞窟のような）、壁とスペースからなる図面データを受け取り、スタート地点からゴール地点までの「最短経路」を出力してください。
　引数にファイル名を受け取り、標準出力に最短経路を記入したものを出力します。

　入力ファイルはテキストファイルで、各文字の役割は以下の通りです。
[*] 壁
[ ] 空白(スペース)
[S] スタート地点
[G] ゴール地点

　出力には、マップデータに加え、経路を $ で示したようにしてください。


【実行イメージ】
**************************
*S* *                    *
* * *  *  *************  *
* *   *    ************  *
*    *                   *
************** ***********
*                        *
** ***********************
*      *              G  *
*  *      *********** *  *
*    *        ******* *  *
*       *                *
**************************

という入力に対し、
**************************
*S* * $$$                *
*$* *$$*$ *************  *
*$* $$* $$$************  *
*$$$$*    $$$$$          *
**************$***********
* $$$$$$$$$$$$$          *
**$***********************
* $$$$$*$$$$$$$$$$$$$$G  *
*  *  $$$ *********** *  *
*    *        ******* *  *
*       *                *
**************************

という出力が出ればOKです。

【細かい要件】
●１回の移動につき上下左右いずれかに進めます。斜めには直接は進めません。
●入力ファイルは完全に正しいものとして仮定して構いません。不正な文字が入っている、行によって長さが異なる、SとGの数が１でない、といったことについてのエラーハンドリングは不要です。
●入力されるマップは長方形であることは仮定してよいですが、サイズは256*256を上限とした不定値です。入力されたファイルを読んで、計算に必要なメモリを確保してください。
●入力データの外周は壁とは限りませんが、暗黙に外側に壁があるとしてください。
●最短経路が複数ある場合、そのうちの１つが出力されていればOKです。
●経路が存在しない場合は、そのことを示すメッセージを出力してください。
●プログラムが正しく動くことだけでなく、コードのスタイルも重視します。最適なデータ構造を使うこと、クラス・関数・変数に適切な名前をつけること、適度な量のコメントをつけることは心がけてください。
●過剰に丁寧に作る必要はありません。ふだん仕事でプログラムを書くときと同じ心構えで臨んでください。

