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.
由题意得是给出一个数独,然后假设有唯一解,那么找出这个解。这一题看起来也是很多种的情况,所以需要用深搜把所有情况都列出来。遍历数独盘里每一个位置,假如遇到是空的,那就从1开始试,每次填完判断当前为位置是否合法,合法就继续深搜,不合法就回溯然后试下一个数。所以大致的时间复杂度是O(9^4),代码如下:Code(LeetCode运行19ms)
class Solution {
public:
void solveSudoku(vector<vector<char>>& board) {
solve(board);
}
bool solve(vector<vector<char>>& board) {
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] = k + '1';
if (isValid(board, i, j) && solve(board)) {
return true;
}
board[i][j] = '.';
}
return false;
}
}
}
return true;
}
bool isValid(vector<vector<char>>& board, int x, int y) {
for (int i = 0; i < 9; i++) {
if (i != x && board[i][y] == board[x][y]) {
return false;
}
}
for (int i = 0; i < 9; i++) {
if (i != y && board[x][i] == board[x][y]) {
return false;
}
}
/*int i, j;
x < y ? (i = 0, j = y - x) : (i = x - y, j = 0);
for (; i < 9 && j < 9; i++, j++) {
if ((i != x && j != y) && board[i][j] == board[x][y]) {
return false;
}
}*/
for (int i = 3 * (x / 3); i < 3 * (x / 3 + 1); i++) {
for (int j = 3 * (y / 3); j < 3 * (y / 3 + 1); j++) {
if ((i != x || j != y) && board[i][j] == board[x][y]) {
return false;
}
}
}
return true;
}
};