可以判断是否是有效数独,可以自动求解数度
/*
* @lc app=leetcode.cn id=37 lang=cpp
*
* [37] 解数独
*/
// @lc code=start
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int row = board.size();
int col = board[0].size();
for(size_t i = 0; i < row; i++) {
map<char, int> flag;
for(size_t j = 0; j < col; j++) {
if(board[i][j] == '.') {
continue;
}
if (flag.find(board[i][j]) != flag.end()) {
return false;
} else {
flag[board[i][j]] = i + j;
}
}
}
for(size_t j = 0; j < col; j++) {
map<char, int> flag;
for(size_t i = 0; i < row; i++) {
if(board[i][j] == '.') {
continue;
}
if (flag.find(board[i][j]) != flag.end()) {
return false;
} else {
flag[board[i][j]] = i + j;
}
}
}
//
for (size_t m = 0; m < 3; m++) {
for (size_t n = 0; n < 3; n++) {
map<char, int> flag;
for (size_t i = 3 * m; i < 3 * m + 3; i++) {
for (size_t j = 3 * n; j < 3 * n + 3; j++) {
if(board[i][j] == '.') {
continue;
}
if (flag.find(board[i][j]) != flag.end()) {
return false;
} else {
flag[board[i][j]] = i + j;
}
}
}
}
}
return true;
}
// place k in (i, j) on board
bool isValid(int row, int col, char placed_char, vector<vector<char>>& board) {
for (int i = 0; i < 9; i++) {
if (board[row][i] == placed_char) {
return false;
}
if (board[i][col] == placed_char) {
return false;
}
}
int block_row = row / 3;
int block_col = col / 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[block_row * 3 + i][block_col * 3 + j] == placed_char) {
return false;
}
}
}
return true;
}
//https://leetcode-cn.com/problems/sudoku-solver/solution/37-jie-shu-du-hui-su-sou-suo-suan-fa-xiang-jie-by-/
bool backTrack(vector<vector<char>>& board) {
char name[] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'};
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') {
for (int k = 0; k < 9; k++) {
// board[i][j] = name[k];
// if (isValidSudoku(board)) { //使用这个会超时
// if(backTrack(board)) return true;
// }
// board[i][j] = '.';
if (isValid(i, j, name[k], board)) {
board[i][j] = name[k];
if (backTrack(board)) {
return true;
} else {
board[i][j] = '.';
}
}
}
return false;
}
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
backTrack(board);
}
};