授業中に説明したナンプレ(或いはSudokuTM)のアルゴリズムの要点をもとに、ナンプレの解答を求めるプログラムを作成せよ。
・問題ファイルからナンプレの9x9のマスの状態を読み込む部分には、こちらで用意したsudoku-frame.cを用いてよい。
・問題ファイルでは、空欄を0で表記するものとする。
・問題を解く部分はmain()関数の中に直接記述せず、必ずmain()関数から別の関数を呼ぶ形で作成すること。
・課題5Aに関しては、1つめの解が得られた時点でプログラムを停止してよい(複数の解を探索する必要はない)。
・実行した結果得られる、解・解を得るのにかかった探索数・実行時間(ミリ秒程度の精度)を標準出力に読みやすい形で出力すること。
参考:unix(linux)で実時間で実行時間を計測するプログラム例(gettimeofday関数を利用)
プログラム内で実行時間を計測したい場合の参考にしてください(他の手段でも構いませんが、ミリ秒オーダーの精度で計測できること)。
問題 | サンプル1 | サンプル2 | |||
出展 | Extreme SudokuoのEvilレベルより | Sudokuサイトの上級++より | |||
問題ファイル | quiz-sample1.txt | quiz-sample2.txt | |||
問題 | 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 |
【状況】 | 【指示】 |
誰かに教えてもらった場合 | その学生(氏名と9桁の学籍番号)をプログラム先頭に記し、さらにプログラム中コメントを使って、教えてもらったところの解説を数行以上書き込むこと。
(教えてもらった部分の解説コメントのないプログラムは全く評価しません。「全体です」のようなコメントの場合も同じです。) |
誰かに教えてあげた場合 | その学生(氏名・学籍番号)をプログラム先頭に記すこと。 |
お互いに相談した場合 | お互いの氏名・学籍番号を、教えてもらった・教えてあげたの例に準拠して提出してください。 |
2012/6/19の授業において説明した、ナップサック問題の解を、最長経路問題を解くアルゴリズムから得る方法について、授業で説明したグラフをもとに説明せよ。
・もとのナップサック問題の例題は、(value,weight) = {(11,7),(3,2),(9,5),(13,8),(5,3)}, 重量制限は10とするものである。
・最長経路問題に変換したグラフを遺漏なく作図すること。
・グラフの辺は、3種類に分けて用意し、説明の時に区別がつくようにしておくこと。
・グラフの辺の重みは(0も含め)必ず明示すること。(ここでいう辺の重みはナップサック問題のweightではない)
・最長経路とその値を、グラフ上でも、解答として文章でも、両方で示すこと。
・【重要】グラフ構造のどこがナップサック問題の解の探索のどの部分に対応するか説明せよ。
・【重要】特に、ある頂点から辺が2つ出ていく場合と1つしか出て行かない場合に注意して説明すること。
・【重要】特に、授業中に示したグラフレイアウトにおいて、グラフ中の上方と右方への移動が何を意味するか説明すること。
ナンプレの亜種として、以下の「対角線」「6x6」の2つを考える。
(wikipediaの説明)
それぞれ、課題5Aのプログラムにおけるバックトラックの条件式をどのように変更することで対応が可能か、説明せよ。
必要であれば疑似プログラムコード(アルゴリズムの進行が疑念なく理解できるレベル)を用いてよい。(C言語による実装まではしなくともよい)
「対角線」縦横な3×3のブロックの他に、対角線にも全ての数字が揃うようにしなければならない問題。
「6x6」9x9の標準問題ではでは3x3ブロックが9個用意され、数字が9種使われるが、そのかわりに2x3のブロックを6個用意し、数字も1〜6の6種のみとする問題。