leetcode--Sudoku Solver
2015-05-13 17:14
323 查看
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.
public class Solution {
boolean rowValid[][]=new boolean[9][10];//rowValid[i][j]表示第i行数字j是否已经使用
boolean columnValid[][]=new boolean[9][10];//columnValid[i][j]表示第i列数字j是否已经使用
boolean subBoardValid[][]=new boolean[9][10];//subBoardValid[i][j]表示第i个小格子内数字j是否已经使用
public void solveSudoku(char[][] board) {
for(int i = 0; i < 9; i++)
for(int j = 0; j < 9; j++)
if(board[i][j] != '.')
fill(i, j, board[i][j] - '0');
solve(board, 0);
}
boolean solve(char[][] board, int index){
if(index > 80)return true;// 0 <= index <= 80,index表示接下来要填充第index个格子
int row = index / 9, col = index - 9*row;
if(board[row][col] != '.')
return solve(board, index+1);
for(int val = '1'; val <= '9'; val++){//每个为填充的格子有9种可能的填充数字
if(isValid(row, col, val-'0')){
board[row][col] = (char) val;
fill(row, col, val-'0');
if(solve(board, index+1))return true;
clear(row, col, val-'0');
}
}
board[row][col] = '.';//注意别忘了恢复board状态
return false;
}
//判断在第row行col列填充数字val后,是否是合法的状态
boolean isValid(int row, int col, int val){
if(!rowValid[row][val] &&
!columnValid[col][val] &&
!subBoardValid[row/3*3+col/3][val])
return true;
return false;
}
//更新填充状态
void fill(int row, int col, int val){
rowValid[row][val] = true;
columnValid[col][val] = true;
subBoardValid[row/3*3+col/3][val] = true;
}
//清除填充状态
void clear(int row, int col, int val){
rowValid[row][val] = false;
columnValid[col][val] = false;
subBoardValid[row/3*3+col/3][val] = false;
}
}
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.
public class Solution {
boolean rowValid[][]=new boolean[9][10];//rowValid[i][j]表示第i行数字j是否已经使用
boolean columnValid[][]=new boolean[9][10];//columnValid[i][j]表示第i列数字j是否已经使用
boolean subBoardValid[][]=new boolean[9][10];//subBoardValid[i][j]表示第i个小格子内数字j是否已经使用
public void solveSudoku(char[][] board) {
for(int i = 0; i < 9; i++)
for(int j = 0; j < 9; j++)
if(board[i][j] != '.')
fill(i, j, board[i][j] - '0');
solve(board, 0);
}
boolean solve(char[][] board, int index){
if(index > 80)return true;// 0 <= index <= 80,index表示接下来要填充第index个格子
int row = index / 9, col = index - 9*row;
if(board[row][col] != '.')
return solve(board, index+1);
for(int val = '1'; val <= '9'; val++){//每个为填充的格子有9种可能的填充数字
if(isValid(row, col, val-'0')){
board[row][col] = (char) val;
fill(row, col, val-'0');
if(solve(board, index+1))return true;
clear(row, col, val-'0');
}
}
board[row][col] = '.';//注意别忘了恢复board状态
return false;
}
//判断在第row行col列填充数字val后,是否是合法的状态
boolean isValid(int row, int col, int val){
if(!rowValid[row][val] &&
!columnValid[col][val] &&
!subBoardValid[row/3*3+col/3][val])
return true;
return false;
}
//更新填充状态
void fill(int row, int col, int val){
rowValid[row][val] = true;
columnValid[col][val] = true;
subBoardValid[row/3*3+col/3][val] = true;
}
//清除填充状态
void clear(int row, int col, int val){
rowValid[row][val] = false;
columnValid[col][val] = false;
subBoardValid[row/3*3+col/3][val] = false;
}
}
相关文章推荐
- LeetCode 37 SudoKu Solver
- leetcode 37 Sudoku Solver
- [leetcode 37] Sudoku Solver
- [leetcode 37]sudoku solver
- leetcode: Sudoku Solver
- Sudoku Solver [LeetCode]
- LeetCode 37. Sudoku Solver(数读游戏)
- Leetcode Sudoku Solver
- leetcode:sudoku solver
- [LeetCode] Sudoku Solver
- [Leetcode] 37. Sudoku Solver
- leetcode-Sudoku Solver
- LeetCode 37 Sudoku Solver(求解数独)(*)
- LeetCode - Sudoku Solver
- leetcode - Sudoku Solver
- leetcode 037 —— Sudoku Solver
- leetcode-Sudoku Solver
- leetcode - 37.Sudoku Solver
- LeetCode - 37. Sudoku Solver
- leetcode 37. Sudoku Solver