Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'.
You may assume that there will be only one unique solution.
![]()
A sudoku puzzle...
![]()
...and its solution numbers marked in red.
The idea is straight forward, put the number in empty place. and check if it is valid and solverable.
Java
public boolean solveSudoku(char[][] board) {
for(int i=0;i<9;i++){
for(int j = 0;j<9;j++){
if(board[i][j]=='.'){
for(int k=1;k<=9;k++){
board[i][j]=(char) (k+48);
if(validSudoku(board, i, j) && solveSudoku(board) )
return true;
board[i][j] = '.';
}
return false;
}
}
}
return true;
}
public boolean validSudoku(char[][] board, int x, int y){
for(int i=0;i<9;i++){
if(i!=x && board[i][y]==board[x][y])
return false;
if(i!=y && board[x][i]==board[x][y])
return false;
}
for(int i=3*(x/3);i<3*(x/3+1);i++){
for(int j=3*(y/3);j<3*(y/3+1);j++){
if(i!=x && j!=y && board[i][j] == board[x][y])
return false;
}
}
return true;
}c++
bool isValidSudoku2(vector<vector<char>> &board, int x,int y){
int i, j;
for(i=0; i<9; i++)
if(i!= x && board[i][y] == board[x][y])
return false;
for(j = 0; j<9; j++)
if(j!= y && board[x][j] == board[x][y])
return false;
for(i = 3*(x/3); i<3*(x/3+1); i++){
for(j = 3 *(y/3); j<3*(y/3+1);j++)
if(i!=x && j!= y && board[i][j] == board[x][y])
return false;
}
return true;
}
bool solveSudoku(vector<vector<char> > &board) {
for(int i=0; i<9;i++){
for(int j=0;j<9;j++){
if('.' == board[i][j]){
for(int k=1;k<=9;k++){
board[i][j] = '0' + k;
if(isValidSudoku2(board,i,j) && solveSudoku(board))
return true;
board[i][j] = '.';
}
return false;
}
}
}
return true;
}

本文介绍了一种通过编程解决数独谜题的方法。利用回溯算法填充空格,并验证每一步是否符合数独规则,确保解决方案的唯一性和正确性。提供了Java和C++两种语言的实现代码。

被折叠的 条评论
为什么被折叠?



