授業中に説明したKnight's Tour(騎士の巡回)の解を求めるプログラムを用いて、チェス盤のサイズが
(1) 5×5 (2) 5×6 (3) 6×6 の場合について、経路の数を求めよ。
スタート地点は(0,0)とする。
このとき、それぞれの実行時間(秒単位でよい)を計測し、実行CPUと環境と合わせて示すこと。
参考:unix(linux)で実時間で実行時間を計測するプログラム例(gettimeofday関数を利用)
プログラム内で実行時間を計測したい場合の参考にしてください(使わなくても構いません)。
【状況】 | 【指示】 |
誰かに教えてもらった場合: | その学生(氏名と9桁の学籍番号)をプログラム先頭に記し、さらにプログラム中コメントを使って、教えてもらったところの解説を数行以上書き込むこと。
(教えてもらった部分の解説コメントのないプログラムは全く評価しません。「全体です」のようなコメントの場合も同じです。) |
誰かに教えてあげた場合: | その学生(氏名・学籍番号)をプログラム先頭に記すこと。 |
お互いに相談した場合: | お互いの氏名・学籍番号を、教えてもらった・教えてあげたの例に準拠して提出してください。 |
上記のKnight's Tourの代わりに、いま、King's Tourを考える。チェスのKingは将棋の王将と同じく、8方向どの方向にも1マス進むことができる。
もちろん、King's Tourの解は存在するだろう。そのプログラムを作成する際にはKnight's Tourのものをほとんど再利用できる。
(1) Knight's Tourのプログラム(4A-1)から変更すべきところを、その部分のみ抜き出して書き換えたプログラムコード部分によって示せ(全部は不要)。
(2) 全解探索で時間計算量を見積もった場合、Knight's TourとKing's Tourで差はあるか、ないか?理由とともに答えよ。
(3) 同じ盤のサイズが与えられたとき、Knight's TourとKing's Tourはどちらが解数が多くなると考えられるか?
(4) 同じ盤のサイズが与えられたとき、Knight's Tourに比べてKing's Tourの実行時間は短くなるか?長くなるか?自分で考える理由と共に答えよ。
※(1)(2)は必ず答えること。(3)(4)は無回答でもよい。(3)(4)は実際に実験してもよいが、推奨はしない。
課題4Aの発展として、騎士の周遊(Knight's Tour Round)の解数を (1) 5×5 (2) 5×6 (3) 6×6 について答えるプログラムを作成し実行結果を示せ。
ナンプレ(或いは数独TM)を解くプログラムを改良して、ある問題が与えられているときに、与えられた数字を1つ抜いた場合に解の数がどれほど増えるかを求め、最も解の数を増やしてしまう数字がどれかを求めるプログラムを作成せよ。下記にサンプルを示すが、提出時には各自適当に収集したもので解答すること。
問題 | サンプル1 | サンプル2 | ||||||
出展 | Extreme SudokuoのEvilレベルより | Sudokuサイトの上級++より | ||||||
問題 | 0 0 5 0 0 2 0 0 8 0 6 0 0 1 0 0 5 0 3 0 0 8 0 0 4 0 0 2 0 0 4 0 0 7 0 0 0 9 0 0 6 0 0 3 0 0 0 4 0 0 9 0 0 6 0 0 3 0 0 1 0 0 5 0 7 0 0 2 0 0 4 0 8 0 0 3 0 0 1 0 0 | 0 2 0 9 0 0 0 0 6 1 0 0 0 0 0 0 9 0 0 0 8 0 0 7 0 0 0 5 0 0 0 0 0 7 0 0 0 0 7 8 0 0 1 0 0 0 0 9 4 0 0 0 0 2 0 0 0 2 0 0 4 0 0 0 6 0 0 0 0 0 0 3 3 0 0 0 0 5 0 8 0 |