๐คฏ37 solve sudoku
https://leetcode.com/problems/sudoku-solver/
ๅ่ฟ้้ขๅฑๅฎๆ็น่ชๆฎ๏ผ็ญๆกๆ่ช่ฏ่ฎบๅบ๏ผๆ็ๆ่ทฏๆถๅฏน็๏ผไฝๆฏ่ฟไธชin placeไฟฎๆนๅพ้พๅๅฏน็ๆ่ง๏ผๅ ไธบbacktrackไธ่ฝๅบๅฎ็ปๆ
ๅคงๆฆ่ฆๆณจๆ็ๅฐฑๆฏ
ๅจๆณจๆ้ๅ็cellไธ้ๅค็ๅๆไธไธ้่ฆvisited๏ผๆฏๅฆ่ฟ้ๅฐฑๆฏๅ ้ๅ่ก๏ผๅฐๆๅณ่พนๅๅปไธไธ่ก๏ผ่ฟๆ ท่ฟๅๆกไปถไนๅพ็ฎๅไบ๏ผ่ตฐๅฐๆๆๅบไธไบๅฐฑ่กจ็คบๆพๅฐ่งฃไบ
boardๅฆๆไธsafe่ฟๆฏ่ฆ้็ฝฎๆ '.'๏ผไธป่ฆๆฏ่ฟ้isSafe็ๅๆณๅณๅฎไบไธไธๆฌกๅฐ่ฏ็็ปๆไผๅฝฑๅไธๆฌก็ๅค่ฏป
ไธ้่ฆๅ็ฌ็rows๏ผcolsๅblocksๆฅ่ฎฐๅฝๆฐๅผ๏ผ็จboard่ถณ็ฃ๏ผไธ็ถ็ๅๆฐ้ฟๅบฆไปฅๅ ๅนด่ฎก็ฎ
class Solution {
public boolean helper(char[][] board, int row, int col){
if(row == board.length){
return true;
}
int nrow = 0;
int ncol = 0;
if(col != board.length -1) {
nrow = row;
ncol = col+1;
}else{
nrow = row+1;
ncol = 0;
}
if(board[row][col] != '.'){
if(helper(board, nrow, ncol)){
return true;
}
}else{
for(int i=1; i<=9; i++){
if(isSafe(board, row, col, i)){
board[row][col] = (char)(i + '0');
if(helper(board, nrow, ncol)){
return true;
}else{
board[row][col] = '.';
}
}
}
}
return false;
}
public boolean isSafe(char[][] board, int row, int col, int number){
for(int i=0; i<board.length; i++){
if(board[i][col] == (char)(number + '0')){
return false;
}
if(board[row][i] == (char)(number +'0')){
return false;
}
}
//grid
int sr = (row/3) *3;
int sc = (col/3) *3;
for(int i = sr; i<sr+3; i++){
for(int j=sc; j< sc+3; j++){
if(board[i][j] == (char)(number + '0')){
return false;
}
}
}
return true;
}
public void solveSudoku(char[][] board) {
helper(board, 0, 0);
}
}
ไธ้ขๆฏๆ่ชๅทฑๅ็็ๆฌ: ๅฅฝๅงๅ ถๅฎไนไธๆฏๅพ้พ๏ผๅ ณ้ฎ็นๆฏ้ๅ็้กบๅบ
class Solution {
public void solveSudoku(char[][] board) {
dfs(board, 0, 0);
}
private boolean dfs(char[][] board, int i, int j) {
if (i == 9) return true;
int x, y;
if (j != 8) {
x = i;
y = j + 1;
} else {
x = i + 1;
y = 0;
}
if (board[i][j] != '.') {
if (dfs(board, x, y)) return true;
return false;
}
for (char num = '1'; num <= '9'; num++) {
if (isValid(board, i, j, num)) {
board[i][j] = num;
if (dfs(board, x, y)) {
return true;
} else {
board[i][j] = '.';
}
}
}
return false;
}
private boolean isValid(char[][] board, int i, int j, char num) {
for (int col = 0; col < 9; col++) {
if (board[i][col] == num) return false;
}
for (int row = 0; row < 9; row++) {
if (board[row][j] == num) return false;
}
int rs = i / 3 * 3;
int cs = j / 3 * 3;
for (int row = rs; row < rs + 3; row++) {
for (int col = cs; col < cs + 3; col++) {
if (board[row][col] == num) return false;
}
}
return true;
}
}
Last updated