Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character
'.'
.You may assume that there will be only one unique solution.
A sudoku puzzle…
…and its solution numbers marked in red.
深搜加回溯剪枝。
class Solution { public: void solveSudoku(vector<vector<char> > &board) { dfs(board, 0); } bool dfs(vector<vector<char >> &board, int idx){ int r,c; //找到空的格子 while(true){ if(idx >= 9 * 9){ return true; } r = idx / 9; c = idx % 9; if(board[r][c] == '.'){ break; } idx++; } for(int i = 1; i < 10;i++){ board[r][c] = '0' + i; if(isValid(board, r, c)){ bool state = dfs(board, idx + 1); if(state == true){ return true; } } } board[r][c] = '.'; return false; } //插入数字到x行y列,检查是否合法 bool isValid(vector<vector<char >> &board, int x, int y){ bool row[10] = {false}; bool column[10] = {false}; bool cell[10] = {false}; //check row for(int i = 0; i < 9; i++){ char c = board[x][i]; if(c == '.'){ continue; } else{ if(row[c - '0'] == true){ return false; } else{ row[c - '0'] = true; } } } for(int i = 0; i < 9; i++){ char c = board[i][y]; if(c == '.'){ continue; } else{ if(column[c - '0'] == true){ return false; } else{ column[c - '0'] = true; } } } int rowStart = x / 3 * 3; int columnStart = y / 3 * 3; for(int i = 0; i < 9; i++){ char c = board[rowStart + i / 3][columnStart + i % 3]; if(c == '.'){ continue; } else{ if(cell[c - '0'] == true){ return false; } else{ cell[c - '0'] = true; } } } return true; } };