[注意]今回のプログラムの内容を全ての人が隅々まで理解する必要はありません。 ただし、プログラム中で使われている HashMap, PriorityQueue, BitSet クラスと Comparable インターフェイス に関しては、必ずJava APIを読んでおいて下さい。
3×3のボードの上で8枚の駒を、空いたマス目を利用して動かし、目的の形にするパズル。 空白部に隣接する駒をスライドすることで盤面を操作する。
(この並び順にするのが目的)P1,1 P1,2 P1,3 P2,1 P2,2 P2,3 P3,1 P3,2 P3,3
Pi,jはそれぞれ0〜8の異なる整数であり、 1〜8がパネルに書かれた数字を、0が穴を表している。
与えられたデータに対し、正しく並べ替える最短の手数を求めるプログラムを作成せよ。
「最短の手数」と「初期状態から最後までの盤面の状態」 と「解を得るまでに確定したノードの数」を示せ。 もしも解がない場合は "no answer" と出力すること。
経由地から終点までの道のりは考慮しない。常に h*(x) = 0。
正しくない位置にあるパネルの個数。 下の例では h* (x) = 6。
穴の位置は計算に入れないことに注意しましょう。 もし穴の位置も計算に入れると、例えば1枚だけパネルがずれて
1 2 3 4 5 6 7 _ 8となっている場合に、正しくはh(x)=1ですがこれをh*(x)=2 と間違ってしまい、 h*(x) <= h(x) が成り立たなくなってしまいます。
位置が正しくないパネルの、正しい位置までのマンハッタン距離の和。 下の例では h* (x) = 1 + 1 + 1 + 2 + 3 + 3 = 11。
この方法でもパネルの位置だけを考慮し、穴の位置は計算に入れないことに注意しましょう。
data01.txt |
|
Puzzle8.javaの実行例 |
|
data02.txt |
|
Puzzle8.javaの実行例 |
|
作成したプログラムが正しく動作することを確認したら、それぞれの 提出先に提出しなさい。
提出した後は、正しく提出されていることを http://ynitta.com/class/algoC/local/handin/ で必ず確認しておいて下さい。
課題提出〆切は次回の講義の開始時刻です。
提出ファイル | Puzzle8.java |
---|---|
コメント欄: |
data3.txt, data4.txt それぞれについて
|
提出先: | 「宿題提出Web:アルゴリズムB:課題6a」 http://ynitta.com/class/algoC/local/handin/up.php?id=kadai6a |
正しく並んだ解を得るまでの最小の手数を求めるプログラム Puzzle8.java の 抜けている部分のコードを自分で書きなさい。
次のdata03.txtとdata04.txt を入力としたとき、 コマンドオプションによって解を得るまでに確定したノードの数がどのように 変わるか調べなさい。
data03.txt |
|
data04.txt |
|