解数独
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
空白格用 ‘.’ 表示。
解题思路:
创建3个数组,分别记录横列、竖列、 3x3 宫内已出现的数字到n1、n2、n3中,之后遍历数独,遇到’.‘则循环填入1-9,若该数字已在n1或n2或n3,则跳过,继续填入下一个数字,若可填入成功,则将n1、n2、n3对应的位置改成1,继续寻找下一个’.’,若查找到最后一列无法填入对应的数字,则开始回溯,n1、n2、n3对应的位置改成0,数独中的位置改成’.’。
class Solution {
public:
int n1[9][9]={0};
int n2[9][9]={0};
int n3[9][9]={0};
void solveSudoku(vector<vector<char>>& board) {
for (int i=0;i<9;i++){
for (int j=0;j<9;j++){
if (board[i][j]!='.'){
n1[i][board[i][j]-'1']=1;
n2[board[i][j]-'1'][j]=1;
n3[i/3*3+j/3][board[i][j]-'1']=1;
}
}
}
backtrack(board,0,0);
}
bool backtrack (vector<vector<char>>& board,int row,int col){
if (row>8) return true;
if (board[row][col]=='.'){
for (int i=1;i<=9;i++){
if (n1[row][i-1]==1||n2[i-1][col]==1 || n3[row/3*3+col/3][i-1]==1) continue;
board[row][col]=i+'0';
n1[row][i-1]=1;
n2[i-1][col]=1;
n3[row/3*3+col/3][i-1]=1;
if (backtrack(board,row+(col+1)/9,(col+1)%9)) return true;
board[row][col]='.';
n1[row][i-1]=0;
n2[i-1][col]=0;
n3[row/3*3+col/3][i-1]=0;
}
}
else return backtrack(board,row+(col+1)/9,(col+1)%9);
return false;
}
};