以下の私のブログに書いた将棋の駒の配置問題を解決したいと思います。
一応、私が作成したものはありますが、時間がかかって解けません。
言語は任意です。
以下のサイトの3.3.および4.のヒントをいただければ幸いです。
一気に問題を解いていただいても構いません。
http://blogs.yahoo.co.jp/artery2020/40173086.html
以下は、上記ブログの引用です。
■ プログラミング課題-駒配置問題
□ 問題
・将棋の駒40枚を9×9の盤上に同じ方向にお互いに取られないように配置できることが知られている。
・ネット上で探せた例は下に示している。
・また多湖輝の「頭の体操」にも例が載っていたが、同じものかは分からない。
・すべての組合せがどのくらいあるのかは、(少なくとも私にとっては)不明である。
・この組み合わせをすべて求める、これが問題。
□ プログラムのスペック
・任意の大きさの盤の問題を解けること。
・9×9だけではなく5×5、あるいは7×8など長方形の盤の問題も解けること
・別の言い方をすれば、プログラム中に番の大きさが記述されていてはいけない。
・三角形や円形の盤は対象外とする。
・既存の将棋駒ではなく、新たな動き方を定義した駒の問題も解けること。
・例えば、横に一つだけ動ける駒などを定義して問題に投入できること。
・別の言い方をすれば、プログラム中に駒の動き方が記述されていてはいけない。
・使用する駒の種類と数を指定できること。
□ 課題
・この問題を解くには、非常に時間がかかるので、いかに計算パワーを使わない解法を実現するかがポイント。
□ 参考
1.駒の動き方を最初に求めておく必要がある
1.1.問題を解いている最中に、「このポイントに、この駒を置いたときは、どことどこに動けるか?」と求めていると、非常に時間がかかる。
1.2.初期起動時に、すべての駒のすべてのポイントでの駒の動き方を求めておく。
2.配置情報の作成と取消のオーバーヘッドを少なくすること。
2.1.実行時には、どこかに駒が配置され、結果として、その行先はどこか?次に配置できる場所はどことか?という情報が作成される。
2.2.大部分の場合は、行き止まりになるので、その情報をキャンセルし、また新たな情報を作成することになる。
2.3.この情報を作成、キャンセルする処理の負荷を、できるだけ軽くすること。
2.4.このデータ構造を作るにも、(実行時に)コストがかかるが、差引してコストが低くなるようにする。
3.配置不可の判定を早めにすること
3.1.駒を配置できなくなるまで配置する ⇒ これはアホ。
3.2.「空きの数 < 残りの駒の数」であれば、不可と判定する。
3.3.上記の状態になる前に、なんとか不可と判定する ⇒ 私にはロジック不明。
4.以前に不可と判定したパターンを保存しておく。
4.1.細かい部分でみれば、同じパターンが何度でも表れるはず。
4.2.ダメだったパターンを記憶しておいて、以降の実行をパスするようにする。
4.3.フィボナッチ数の計算でも以前に計算した値を記憶しておけばスピードは速くなるが、これと同じ。
4.4.ただ同じバターンであることの定義や認識が難しい。
4.5.パターンの単位を細かいものから、少し大きいものまで、階層的に記憶しておき、スピードアップを図る。
5.複数のコンピュータを利用して解く。
・私が作成したJavaプログラムは、次の状況
・2.は実装したが、もっとよい方法があったかもしれない。
・3.3.は未実装
・4.は未実装
・5.は未実装
・6×6盤では簡単に終了したが、7×7盤では解けなかった。
・3.3.と4.が実現できれば、非常に効果的と思われる。
□ お願い
私のパソコンの能力と私のプログラミング能力では難しいので、この問題をどなたか解いていただきたい。
====
回答2件
あなたの回答
tips
プレビュー