编写一个程序,通过填充空格来解决数独问题。
一个数独的解法需遵循如下规则:
- 数字
1-9
在每一行只能出现一次。- 数字
1-9
在每一列只能出现一次。- 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。空白格用
'.'
表示。
一个数独。
答案被标成红色。
提示:
- 给定的数独序列只包含数字
1-9
和字符'.'
。 - 你可以假设给定的数独只有唯一解。
- 给定数独永远是
9x9
形式的。
搜就完事了,用两个变量记录当前处理的下标,然后对边界值进行判断
(因为把方法定义在class外面还wa了一发)
class Solution {
public:
int v[15][15]={0};
int flag = 0;
bool pd(int x,int y ,vector<vector<char>>& board){
map<char,int> ma;
for(int i =0 ;i<9;i++){
if(ma[board[x][i]]) return false;
if(board[x][i] != '.') ma[board[x][i]]++;
}
ma.clear();
for(int i =0 ;i<9;i++){
if(ma[board[i][y]]) return false;
if(board[i][y] != '.') ma[board[i][y]]++;
}
ma.clear();
int q_x = x / 3 * 3, q_y = y / 3 * 3;
for(int i = 0;i < 3;i++){
for(int j = 0;j < 3;j++){
if(ma[board[q_x + i][q_y + j]]) return false;
if(board[q_x + i][q_y + j] != '.') ma[board[q_x + i][q_y + j]]++;
}
}
return true;
}
void dfs(int x,int y,vector<vector<char>>& board){
// cout<<x<<" "<<y<<endl;
if( x == 9 && y == 0 ){
flag = 1;
return ;
}
int xx = x,yy = y;
if( y == 8) xx = x + 1,yy = 0;
else xx = x,yy = y + 1;
if(board[x][y] != '.'){
dfs(xx,yy,board);
}else{
for(int i = 1;i <= 9&& flag == 0 ;i++){
board[x][y] = i + '0';
if(pd(x,y,board)){
dfs(xx,yy,board);
}
if(flag == 0 ) board[x][y] = '.';
}
}
}
void solveSudoku(vector<vector<char>>& board){
dfs(0,0,board);
}
};