编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
一个数独。
答案被标成红色。
提示:
给定的数独序列只包含数字 1-9 和字符 '.' 。
你可以假设给定的数独只有唯一解。
给定数独永远是 9x9 形式的。
思路:
1.标记出每一行,每一列和每一块中已经存在的数字,如下图(假设当前位置[i,j],值为t):
2.定义dfs状态
bool dfs(i,j)表示在填完当前位置[i,j]后,是否还存在填完数独的可能性;
题解cpp:
class Solution {
public:
bool row[9][10];
bool col[9][10];
bool cell[3][3][10];
void solveSudoku(vector<vector<char>>& board) {
memset(row, 0, sizeof row);
memset(col, 0, sizeof col);
memset(cell, 0, sizeof cell);
for(int i = 0;i < 9;i ++){
for(int j = 0;j < 9;j ++){
if(board[i][j] != '.'){
int t = board[i][j] - '0';
row[i][t] = col[j][t] = cell[i/3][j/3][t] = true;
}
}
}
dfs(board,0,0);
}
bool dfs(vector<vector<char>>& board,int x,int y){
if(y == 9) x ++,y = 0;
if(x == 9) return true;
if(board[x][y] != '.') return dfs(board,x,y + 1);
for(int i = 1;i <= 9;i ++){
if(!row[x][i] && !col[y][i] && !cell[x/3][y/3][i]){
char ch = '0' + i;
board[x][y] = ch;
row[x][i] = col[y][i] = cell[x/3][y/3][i] = true;
if(dfs(board,x,y + 1)) return true;
board[x][y] = '.';
row[x][i] = col[y][i] = cell[x/3][y/3][i] = false;
}
}
return false;
}
};