#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() { int PPS = 24; int Border = 3; int CW = 1; int PW = 2; int i, j, x, y; printf("convert -size %dx%d xc:Black \\\n", PPS*9+Border*2+CW*8+PW*2, PPS*9+Border*2+CW*8+PW*2); printf(" -background White -fill Black \\\n"); x = Border; for (i = 0; i < 9; i++) { y = Border; for (j = 0; j < 9; j++) { printf("\\( -size %dx%d -gravity Center label:%c \\)", PPS, PPS, Grid[i][j] == -1 ? '-' : Grid[i][j] + '0'); printf(" -geometry %dx%d+%d+%d -gravity NorthWest -composite \\\n", PPS, PPS, x, y); y += (PPS+CW); if (j == 2 || j == 5) y += PW; } x += (PPS+CW); if (i == 2 || i == 5) x += PW; } printf(" Sudoku.jpg\n"); } 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; }