# [LeetCode] 37. Sudoku Solver 求解数独

Write a program to solve a Sudoku puzzle by filling the empty cells.

A sudoku solution must satisfy all of the following rules:

1. Each of the digits 1-9 must occur exactly once in each row.
2. Each of the digits 1-9 must occur exactly once in each column.
3. Each of the the digits 1-9 must occur exactly once in each of the 9 3x3 sub-boxes of the grid.

Empty cells are indicated by the character '.'.

A sudoku puzzle...

...and its solution numbers marked in red.

Note:

• The given board contain only digits 1-9and the character '.'.
• You may assume that the given Sudoku puzzle will have a single unique solution.
• The given board size is always 9x9.

class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
helper(board, 0, 0);
}
bool helper(vector<vector<char>>& board, int i, int j) {
if (i == 9) return true;
if (j >= 9) return helper(board, i + 1, 0);
if (board[i][j] != '.') return helper(board, i, j + 1);
for (char c = '1'; c <= '9'; ++c) {
if (!isValid(board, i , j, c)) continue;
board[i][j] = c;
if (helper(board, i, j + 1)) return true;
board[i][j] = '.';
}
return false;
}
bool isValid(vector<vector<char>>& board, int i, int j, char val) {
for (int x = 0; x < 9; ++x) {
if (board[x][j] == val) return false;
}
for (int y = 0; y < 9; ++y) {
if (board[i][y] == val) return false;
}
int row = i - i % 3, col = j - j % 3;
for (int x = 0; x < 3; ++x) {
for (int y = 0; y < 3; ++y) {
if (board[x + row][y + col] == val) return false;
}
}
return true;
}
};

class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
helper(board);
}
bool helper(vector<vector<char>>& board) {
for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (board[i][j] != '.') continue;
for (char c = '1'; c <= '9'; ++c) {
if (!isValid(board, i, j, c)) continue;
board[i][j] = c;
if (helper(board)) return true;
board[i][j] = '.';
}
return false;
}
}
return true;
}
bool isValid(vector<vector<char>>& board, int i, int j, char val) {
for (int k = 0; k < 9; ++k) {
if (board[k][j] != '.' && board[k][j] == val) return false;
if (board[i][k] != '.' && board[i][k] == val) return false;
int row = i / 3 * 3 + k / 3, col = j / 3 * 3 + k % 3;
if (board[row][col] != '.' && board[row][col] == val) return false;
}
return true;
}
};

Github 同步地址：

https://github.com/grandyang/leetcode/issues/37

Valid Sudoku

Unique Paths III

https://leetcode.com/problems/sudoku-solver/

https://leetcode.com/problems/sudoku-solver/discuss/15853/Simple-and-Clean-Solution-C%2B%2B

https://leetcode.com/problems/sudoku-solver/discuss/15752/Straight-Forward-Java-Solution-Using-Backtracking

LeetCode All in One 题目讲解汇总(持续更新中...)

posted @ 2015-04-13 12:22  Grandyang  阅读(19457)  评论(5编辑  收藏  举报