#include #include #include "sudoku.h" Sudoku::Sudoku() { int i, j; char c; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { if (!(cin >> c)) { cerr << "Bad Sudoku File -- not enough entries\n"; exit(1); } if (c == '-') Grid[i][j] = -1; else if (c >= '0' && c <= '9') Grid[i][j] = c - '0'; else { cerr << "Bad Sudoku File -- entry: " << c << endl; exit(1); } } } for (i = 0; i < 9; i++) { if (!Is_Row_Valid(i)) { cerr << "Bad Sudoku File -- Bad row " << i << endl; exit(1); } if (!Is_Col_Valid(i)) { cerr << "Bad Sudoku File -- Bad col " << i << endl; exit(1); } } for (i = 0; i < 9; i += 3) { for (j = 0; j < 9; j += 3) { if (!Is_Panel_Valid(i, j)) { cerr << "Bad Sudoku File -- Bad panel starting at row " << i << " col " << j << endl; exit(1); } } } } void Sudoku::Print_Screen() { int i, j; for (i = 0; i < 9; i++) { for (j = 0; j < 9; j++) { if (j != 0) printf(" "); if (Grid[i][j] == -1) printf("- "); else printf("%d ", Grid[i][j]); if (j == 2 || j == 5) printf(" "); } printf("\n"); if (i == 2 || i == 5) printf("\n"); } } void Sudoku::Print_Convert() { } bool Sudoku::Solve() { return Recursive_Solve(0, 0); } bool Sudoku::Is_Row_Valid(int r) { int i; for (i = 1; i <= 9; i++) checker[i] = false; for (i = 0; i < 9; i++) { if (Grid[r][i] != -1) { if (checker[Grid[r][i]]) return false; checker[Grid[r][i]] = true; } } return true; } bool Sudoku::Is_Col_Valid(int c) { int i, j; for (i = 1; i <= 9; i++) checker[i] = false; for (i = 0; i < 9; i++) { if (Grid[i][c] != -1) { if (checker[Grid[i][c]]) return false; checker[Grid[i][c]] = true; } } return true; } bool Sudoku::Is_Panel_Valid(int sr, int sc) { int r, c, i; for (i = 1; i <= 9; i++) checker[i] = false; for (r = sr; r < sr+3; r++) { for (c = sc; c < sc+3; c++) { if (Grid[r][c] != -1) { if (checker[Grid[r][c]]) return false; checker[Grid[r][c]] = true; } } } return true; } bool Sudoku::Recursive_Solve(int r, int c) { int i; /* Skip all non-dash characters */ while (r < 9 && Grid[r][c] != -1) { c++; if (c == 9) { r++; c = 0; } } /* Base case -- we're done */ if (r == 9) return true; /* Try each value. If successful, then return true. */ for (i = 1; i <= 9; i++) { Grid[r][c] = i; if (Is_Row_Valid(r) && Is_Col_Valid(c) && Is_Panel_Valid(r-r%3, c-c%3) && Recursive_Solve(r, c)) { return true; } } /* If unsuccessful, reset the element and return false. */ Grid[r][c] = -1; return false; }