diff options
Diffstat (limited to 'src/sudoku.cc')
-rw-r--r-- | src/sudoku.cc | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/src/sudoku.cc b/src/sudoku.cc index 9fcb865..4fcfbf9 100644 --- a/src/sudoku.cc +++ b/src/sudoku.cc @@ -35,11 +35,12 @@ int Sudoku::compare_and_assign(const Sudoku & other) } return d; } - +/* void Sudoku::set_value(int row, int column, int cell_value) { sudoku_cell[row][column].set_value(cell_value); } +*/ // reset the solution space and calculate possible values for all cells void Sudoku::reset() @@ -51,9 +52,24 @@ void Sudoku::reset() } } +bool Sudoku::validate() +{ + bool v = true; + for (int row = 0; row < 9; row++) { + for (int column = 0; column < 9; column++) { + reset_cell(row, column); + v = v && sudoku_cell[row][column].valid(); + } + } + return v; +} + // reset the solution space for this cell and calculate possible values void Sudoku::reset_cell(int pos_row, int pos_column) { + // mark cell as valid + sudoku_cell[pos_row][pos_column].set_valid(true); + // reset all possibilities for this cell for (int possible_value = 0; possible_value < 9; possible_value++) { sudoku_cell[pos_row][pos_column].set_possibility(possible_value, true); @@ -62,7 +78,7 @@ void Sudoku::reset_cell(int pos_row, int pos_column) // eliminate row for (int column = 0; column < 9; column++) { if (column != pos_column) { - const int v = value(pos_row,column); + const int v = cell(pos_row,column).value(); if ((v > 0) && (v <= 9)) { sudoku_cell[pos_row][pos_column].set_possibility(v -1, false); } @@ -72,7 +88,7 @@ void Sudoku::reset_cell(int pos_row, int pos_column) // eliminate column for (int row = 0; row < 9; row++) { if (row != pos_row) { - const int v = value(row,pos_column); + const int v = cell(row,pos_column).value(); if ((v > 0) && (v <= 9)) { sudoku_cell[pos_row][pos_column].set_possibility(v -1, false); } @@ -87,7 +103,7 @@ void Sudoku::reset_cell(int pos_row, int pos_column) for (int row = grid_row; row < grid_row + 3; row++) { for (int column = grid_column; column < grid_column + 3; column ++) { if ((column != pos_column) && (row != pos_row)) { - const int v = value(row, column); + const int v = cell(row, column).value(); if ((v > 0) && (v <= 9)) { sudoku_cell[pos_row][pos_column].set_possibility(v -1, false); } @@ -96,6 +112,13 @@ void Sudoku::reset_cell(int pos_row, int pos_column) } } + + // set validity + if ((cell(pos_row,pos_column).value() > 0) && (cell(pos_row,pos_column).value() <= 9)) { + if (!sudoku_cell[pos_row][pos_column].possibility(sudoku_cell[pos_row][pos_column].value() - 1)) { + sudoku_cell[pos_row][pos_column].set_valid(false); + } + } } /* @@ -120,7 +143,7 @@ int Sudoku::solve_coverage() // verify if there's exactly one possibility for v in this row for (int column = 0; column < 9 ; column++) { - if (!value(row, column) && sudoku_cell[row][column].possibility(v - 1)) { + if (!cell(row, column).value() && cell(row,column).possibility(v - 1)) { // value is still possible for this cell available_column = column; } else { @@ -129,7 +152,7 @@ int Sudoku::solve_coverage() } if (covered == 8) { // value is only possible for a single cell - solution.set_value(row, available_column, v); + solution.cell(row, available_column).set_value(v); // qDebug() << "(" << row << "," << available_column << ") row covered, value " << v; } } @@ -141,7 +164,7 @@ int Sudoku::solve_coverage() // verify if there's exactly one possibility for v in this column for (int row = 0; row < 9; row++) { - if (!value(row, column) && sudoku_cell[row][column].possibility(v - 1)) { + if (!cell(row, column).value() && sudoku_cell[row][column].possibility(v - 1)) { // value is still possible a single cell available_row = row; } else { @@ -150,7 +173,7 @@ int Sudoku::solve_coverage() } if (covered == 8) { // value is only possible for a single cell - solution.set_value(available_row, column, v); + solution.cell(available_row, column).set_value(v); // qDebug() << "(" << available_row << "," << column << ") column covered, value " << v; } } @@ -168,7 +191,7 @@ int Sudoku::solve_coverage() int available_pos = 0; int covered = 0; - if (!value(sg_rowidx, sg_colidx) && sudoku_cell[sg_rowidx][sg_colidx].possibility(v - 1)) { + if (!cell(sg_rowidx, sg_colidx).value() && cell(sg_rowidx,sg_colidx).possibility(v - 1)) { // value is still possible a single cell available_pos = subgrid_pos; } else { @@ -179,13 +202,15 @@ int Sudoku::solve_coverage() // value is only possible for a single cell int av_rowidx = sg_row + available_pos / 3; int av_colidx = sg_column + available_pos % 3; - solution.set_value(av_rowidx, av_colidx, v); + solution.cell(av_rowidx, av_colidx).set_value(v); // qDebug() << "(" << av_rowidx << "," << av_colidx << ") subgrid covered, value " << v; } } } } + reset(); + return compare_and_assign(solution); } @@ -199,18 +224,20 @@ int Sudoku::solve_constraints() Sudoku solution; for (int row = 0; row < 9; row++) { for (int column = 0; column < 9; column++) { - solution.set_value(row, column, solve_constraints(row, column)); + solution.cell(row, column).set_value(solve_constraints(row, column)); } } + reset(); + return compare_and_assign(solution); } int Sudoku::solve_constraints(int pos_row, int pos_column) { // verify if the cell has already been solved - if ((value(pos_row,pos_column) > 0 ) && (value(pos_row,pos_column) <= 9)) { - return value(pos_row,pos_column); + if ((cell(pos_row,pos_column).value() > 0 ) && (cell(pos_row,pos_column).value() <= 9)) { + return cell(pos_row,pos_column).value(); } bool possible_solution[9]; @@ -222,7 +249,7 @@ int Sudoku::solve_constraints(int pos_row, int pos_column) // eliminate row for (int column = 0; column < 9; column++) { if (column != pos_column) { - const int v = value(pos_row,column); + const int v = cell(pos_row,column).value(); if ((v > 0) && (v <= 9)) { possible_solution[v - 1] = false; } @@ -231,7 +258,7 @@ int Sudoku::solve_constraints(int pos_row, int pos_column) // eliminate column for (int row = 0; row < 9; row++) { if (row != pos_row) { - const int v = value(row,pos_column); + const int v = cell(row,pos_column).value(); if ((v > 0) && (v <= 9)) { possible_solution[v - 1] = false; } @@ -245,7 +272,7 @@ int Sudoku::solve_constraints(int pos_row, int pos_column) for (int row = grid_row; row < grid_row + 3; row++) { for (int column = grid_column; column < grid_column + 3; column ++) { if ((column != pos_column) && (row != pos_row)) { - const int v = value(row, column); + const int v = cell(row, column).value(); if ((v > 0) && (v <= 9)) { possible_solution[v - 1] = false; } |