summaryrefslogtreecommitdiff
path: root/src/sudoku.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/sudoku.cc')
-rw-r--r--src/sudoku.cc59
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;
}