首页 > 代码库 > Valid Sudoku

Valid Sudoku

这道题是个细节实现题,只要把valid sudoku满足的三个条件判断一下即可。

valid sudoku需满足下列三个条件:

1)每一行数字1~9有且只出现一次。2)每一列数字1~9有且只出现一次。3)对于每个3*3的sub-box(用i=3、6,j=3、6两条线划分,总共9个sub-box)数字1~9有且只出现一次。

基本思路是可以用一个哈希表记录一个数字是否在一行(列,sub-box)中出现过,如果出现过,则返回false。

 1 class Solution { 2 public: 3     bool isValidSudoku(vector<vector<char> > &board) { 4         //validate rows and columns 5         for(int i = 0; i < 9; i++){ 6             unordered_map<char,bool> row_map; 7             unordered_map<char,bool> column_map; 8             for(int j = 0; j < 9; j++){ 9                 if(board[i][j] != .){10                   if(row_map.find(board[i][j]) != row_map.end()) return false;11                   row_map[board[i][j]] = true;12                     13                 }14                 if(board[j][i] != .){15                   if(column_map.find(board[j][i]) != column_map.end()) return false;16                   column_map[board[j][i]] = true;17                 }18             }19         }20         //validate subgrids21         for(int i = 0; i < 9; i += 3){22             for(int j = 0; j < 9; j += 3){23                 unordered_map<char,bool> grid_map;24                 for(int row = i; row < i+3; row++)25                     for(int col = j; col < j+3; col++){26                         if(board[row][col] != .){27                             if(grid_map.find(board[row][col]) != grid_map.end()) return false;28                             grid_map[board[row][col]] = true;29                         }30                     }31             }32         }33         return true;34     }35 };

还可以用一个数组来代替unordered_map,这样可以用更少的空间。