メニエスの名のもとに

プログラミング関係を中心としたぐだぐだブログ

ナンプレ(数独)問題作成プログラム その16 digging hole

debug

バグはdigging_hole 関数の中の次の行にありました。

	int r = solve(&work, &info);

本来は work ではなく array を指定するべきだった。これは workという変数名が悪いので save に変更しました。さらにそれだけでなく、このままだと前回解いた後の状態では開けた所に解が入っているので、新しくあけた穴二つ分だけ解くことになり、必ず解けてしまいます。なので穴は全部穴らしくする必要がある。それがfixed_only、従って上の行を次のように直しました。(work -> save はdigging_hole 関数内で全部置換)

	fixed_only(array, FULL_SYMBOL);
	int r = solve(array, &info);

これで実行すると、次のような結果になります。

$ ./digging_hole
kill_single:134
kill_hidden:0
kill_locked:0
kill_tuple :0
max_tuple  :0
max_hidden :0
swordfish  :0
max_fish   :0
fx_count   :42
solved     :1

[1]   [3][4][9][6]


[4][5]            [2]   [9]


[7]      [2][5]      [4][6]


[2][1][4][7]         [9]


      [7][6]   [9][4]


   [9]         [2][7][1][3]


[3][4]      [7][5]      [1]


[8]   [1]            [5][7]


         [8][6][1][3]   [4]

間違ってはいないんですが、穴が少ないというか数字が多い。なので次の段階としてここから更に穴を掘ることを考えます。ランダムに穴を開けて、解けなかったら終了していたのですが、そうではなく数字があるところ全部について、そこを穴にしても解けるかという判定をすればまだ穴が開けられるはずです。
でも日曜だから頑張らないで次回にまわすのであった。