您的位置:首页 > 其它

Sudoku Solver:数独求解

2017-12-24 16:35 357 查看
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.
思路:这道题是在验证数独验证数独点击打开链接的基础上,求出答案。方法是采用回溯法穷举所有可能。

class Solution {
public boolean valid(char[][] board) {
for (int i = 0; i < 9; i++) {
HashSet row = new HashSet<>();
HashSet col = new HashSet<>();
HashSet cube = new HashSet<>();
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.' && !row.add(board[i][j]))
return false;
if (board[j][i] != '.' && !col.add(board[j][i]))
return false;
if (board[i / 3 * 3 + j / 3][i % 3 * 3 + j % 3] != '.'
&& !cube.add(board[i / 3 * 3 + j / 3][i % 3 * 3 + j % 3]))
return false;
}
}
return true;
}

public boolean solve(char[][] board) {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] == '.') {
for (char x = '1'; x <= '9'; x++) {
board[i][j] = x;
if (!valid(board)) {
board[i][j] = '.';//注意此处要恢复成原样,因为当x=='9'时假设被continue,之后false后虽然返回,但是board却被修改成不正确的样子
continue;
}

if (solve(board)) {
return true;
} else {
board[i][j] = '.';
}
}
return false;//注意此处极容易出错!!!当所有尝试都已经试过时,证明此路不通,需要返回FALSE以便回溯。
}
}
}
return true;
}

public void solveSudoku(char[][] board) {
if (board.length <= 0)
return;
solve(board);
}
}
前两天还看到朋友圈有人在玩数独,还再思考怎么求解,原来是试出来的,看来人类也不聪明啊...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: