Update
This commit is contained in:
@@ -432,6 +432,70 @@ var solveSudoku = function(board) {
|
||||
};
|
||||
```
|
||||
|
||||
C:
|
||||
|
||||
```C
|
||||
bool isValid(char** board, int row, int col, int k) {
|
||||
/* 判断当前行是否有重复元素 */
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (board[i][col] == k) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/* 判断当前列是否有重复元素 */
|
||||
for (int j = 0; j < 9; j++) {
|
||||
if (board[row][j] == k) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/* 计算当前9宫格左上角的位置 */
|
||||
int startRow = (row / 3) * 3;
|
||||
int startCol = (col / 3) * 3;
|
||||
/* 判断当前元素所在九宫格是否有重复元素 */
|
||||
for (int i = startRow; i < startRow + 3; i++) {
|
||||
for (int j = startCol; j < startCol + 3; j++) {
|
||||
if (board[i][j] == k) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* 满足条件,返回true */
|
||||
return true;
|
||||
}
|
||||
|
||||
bool backtracking(char** board, int boardSize, int* boardColSize) {
|
||||
/* 从上到下、从左到右依次遍历输入数组 */
|
||||
for (int i = 0; i < boardSize; i++) {
|
||||
for (int j = 0; j < *boardColSize; j++) {
|
||||
/* 遇到数字跳过 */
|
||||
if (board[i][j] != '.') {
|
||||
continue;
|
||||
}
|
||||
/* 依次将数组1到9填入当前位置 */
|
||||
for (int k = '1'; k <= '9'; k++) {
|
||||
/* 判断当前位置是否与满足条件,是则进入下一层 */
|
||||
if (isValid(board, i, j, k)) {
|
||||
board[i][j] = k;
|
||||
/* 判断下一层递归之后是否找到一种解法,是则返回true */
|
||||
if (backtracking(board, boardSize, boardColSize)) {
|
||||
return true;
|
||||
}
|
||||
/* 回溯,将当前位置清零 */
|
||||
board[i][j] = '.';
|
||||
}
|
||||
}
|
||||
/* 若填入的9个数均不满足条件,返回false,说明此解法无效 */
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/* 遍历完所有的棋盘,没有返回false,说明找到了解法,返回true */
|
||||
return true;
|
||||
}
|
||||
|
||||
void solveSudoku(char** board, int boardSize, int* boardColSize) {
|
||||
bool res = backtracking(board, boardSize, boardColSize);
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
|
||||
|
||||
Reference in New Issue
Block a user