メニエスの名のもとに

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

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

solve.c

/** 候補を減らす関数タイプ */
typedef int (*solver_t)(numpl_array *);

/** 関数の数 */
static const int max_solvers = 5;

/** 関数 */
static solver_t solvers[] = {
    kill_single,
    kill_hidden_single,
    kill_locked_candidate,
    kill_tuple,
    kill_fish,
    NULL};

/**
 * 人間がナンプレを解くときの手法を使って解く
 * どの手法を使ったかをinfo に記録する。
 * @param array ナンプレ盤面配列
 * @param info どの解法を使ったかを記録する
 * @return 1 解けた
 * @return 0 解けていない
 * @return -1 矛盾が発生していて解けない
 */
int solve(numpl_array * array, solve_info * info)
{
    info->ks_count = 0;
    info->kh_count = 0;
    info->kt_count = 0;
    info->kl_count = 0;
    info->sf_count = 0;
    info->fx_count = 0;
    info->solved = 0;
    int c = 0;
    do {
	for (int i = 0; i < max_solvers; i++) {
	    if (solvers[i] == NULL) {
		break;
	    }
	    c = solvers[i](array);
	    if (c > 0) {
		set_info(info, c, solvers[i]);
		break;
	    }
	    if (c < 0) {
		break;
	    }
	}
    } while (c > 0);
    if (c < 0) {
	info->solved = 0;
    } else {
	if (is_solved(array)) {
	    info->solved = 1;
	} else {
	    info->solved = 0;
	}
    }
    info->fx_count = count_fixed(array);
    if (c < 0) {
	return -1;
    } else {
	return info->solved;
    }
}

ここには挙げていないset_info の中身が美しくない。make して実行する。locked candidate は大丈夫。

./solve "5 71    3 2  4   9 91  8     6 19    1     5    65 4     8  29 8   6  4 4    16 8"
solved
547196823
628345719
391278564
756419382
214783956
983652471
165834297
832967145
479521638
kill_single:213
kill_hidden:18
kill_locked:1
kill_tuple :0
max_tuple  :0
max_hidden :0
swordfish  :0
max_fish   :0
fx_count   :28
solved     :1

次は tuple

./solve "  24     1 7 3 6 4 3   1    74 8  6           5  2 98    2   9 9 3 4 826     95  "
                  1 31 31 3
 56  6[2][4] 5  56
 8  8       7 97         89

[1][9][7][8][3][2][6][5][4]


[4][3] 56 56 5 [1][2][7]
       8      9          89
 23              31 3   123
   [7][4][9][8] 5    [6] 5

 23 2            3  3  3 23
  6  6[9][1] 5  564  4   5
 8  8       7  7  7     7
  3                       3
  6[5][1]  6[2][4][9][8]
         7              7
            1     1 3   1 3
 564 6 56[2]  6[8]4  [9]
7                 7     7

[9][1][3] 5 [4] 5 [8][2][6]
         7     7
 2  2       1        1  1
  64 6  6[3]  6[9][5]4
78  8  8                7
kill_single:170
kill_hidden:9
kill_locked:3
kill_tuple :0
max_tuple  :0
max_hidden :0
swordfish  :0
max_fish   :0
fx_count   :27
solved     :0

ダメじゃん。動いているプログラムを書き直しているだけなんだけど、動作がおかしい。こういうことは珍しくないのだ。しかし1行目にNaked Pair があるからわかりやすいぞ。でも日曜だからデバッグはまたあとでやろう。

ディスガイア

昨日今日とふと思い出してディスガイア4をやっていた。なんで急にディスガイアを思い出したのか考えてみたら、これは選挙がテーマになっていたのだな。バールソードを1から逆海賊までアイテム界で鍛え上げるだけの作業ですよ。なんという人生の無駄でしょうか。まあ、無駄でないことなどそう多くはないけど。

魔界戦記ディスガイア4(通常版)

魔界戦記ディスガイア4(通常版)