public FlagSeq(FlagSeq fs) { foreach (int i in Range9.ary) { private_fs[i] = fs[i]; } } //copy
void off_min() { Pos pos = choose_pos(); FlagSeq fs = fsboard[pos.r, pos.c]; foreach (int i in Range9.ary) { if (fs[i] == true) { fs[i] = false; break; } } }
FlagSeq [,] fsboard_dup() { FlagSeq [,] fsb = new FlagSeq [Range9.length, Range9.length]; foreach (int i in Range9.ary) { foreach (int j in Range9.ary) { if (board[i, j] == 0) { fsb[i, j] = new FlagSeq(fsboard[i, j]); } } } return(fsb); }
// ---------------------- Constructor ---------------------- public SudokuSolver(int [,] b) { // board の初期化 board = b; // fsboard の初期化 foreach (int i in Range9.ary) { foreach (int j in Range9.ary) { if (board[i, j] == 0) { fsboard[i, j] = new FlagSeq(); // すべての flag が true である配列を生成して返す。 initial_check_num(i, j); } } } // 最初の理詰め logical_put(); // 確定したマスに数字を入れて、その影響計算を計算して…… }
// -------------------- put_min -------------------- void put_min(Pos pos) { int r = pos.r, c = pos.c; FlagSeq fs = fsboard[r, c]; int i; // 置きにいく。 for (i = 0; i < Range9.length; i++) { if (fs[i] == true) { break; } } board[r, c] = i + 1; // flag を倒したりはしない(don't care)。 // 影響計算をする。 influence_rect(r, c, r, 0, 1, 9); influence_rect(r, c, 0, c, 9, 1); influence_rect(r, c, (r / 3) * 3, (c / 3) * 3, 3, 3); }