编写一个程序,通过填充空格来解决数独问题。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
一个数独。
暴力解法
代码:
class Solution {
public:
bool flag;
bool isPlace(int count, vector<vector<char>>& board) {
int row = count / 9;
int col = count % 9;
int j;
//同一行
for (j = 0; j < 9; ++j) {
if (board[row][j] == board[row][col] && j != col) {
return false;
}
}
//同一列
for (j = 0; j < 9; ++j) {
if (board[j][col] == board[row][col] && j != row) {
return false;
}
}
//同一小格
int tempRow = row / 3 * 3;
int tempCol = col / 3 * 3;
for (j = tempRow; j < tempRow + 3; ++j) {
for (int k = tempCol; k < tempCol + 3; ++k) {
if (board[j][k] == board[row][col] && j != row && k != col) {
return false;
}
}
}
return true;
}
void backtrace(int count, vector<vector<char>>& board) {
if (count == 81) {
flag = true;
return;
}
int row = count / 9;
int col = count % 9;
if (board[row][col] == '.') {
for (int i = '1'; i <= '9'; ++i) {
board[row][col] = i;//赋值
if (isPlace(count, board)) {//可以放
backtrace(count + 1, board);//进入下一层
}
if (flag == true) return;
}
board[row][col] = '.';//回溯
}
else {
backtrace(count + 1, board);
}
}
void solveSudoku(vector<vector<char>>& board) {
flag = false;
backtrace(0,board);
}
};