您的位置:首页 > 其它

个人记录-LeetCode 37. Sudoku Solver

2016-11-29 20:00 411 查看
问题:

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.

代码示例:

参考LeetCode 36. Valid Sudoku中判断Sudoku是否有效的第二种方法,

结合递归解决。

public class Solution {
public void solveSudoku(char[][] board) {
boolean[][] row = new boolean[9][9];
boolean[][] column = new boolean[9][9];
boolean[][] unit = new boolean[9][9];

for (int i = 0; i < 9; ++i) {
for (int j = 0; j < 9; ++j) {
if (board[i][j] == '.') {
continue;
}

int loc = board[i][j] - '1';
row[i][loc] = true;
column[j][loc] = true;
unit[(i/3)*3 + j/3][loc] = true;
}
}

findTheResult(board, row, column, unit, 0, 0);
}

private static boolean findTheResult(char[][] board, boolean[][] row, boolean[][] column, boolean[][] unit,
int rowIndex, int columnIndex) {
//找到本次应该写入值的位置
while(rowIndex < 9) {
if (board[rowIndex][columnIndex] == '.') {
break;
}

if (columnIndex == 8) {
++rowIndex;
columnIndex = 0;
} else {
++columnIndex;
}
}

//写满了,说明找到结果
if (rowIndex == 9) return true;

//每个位置,都试着写入所有可能的数
for (int k = 0; k < 9; ++k) {
//不能重复
if (row[rowIndex][k] || column[columnIndex][k] || unit[(rowIndex/3)*3 + columnIndex/3][k]) {
continue;
}

board[rowIndex][columnIndex] = (char)(k + '1');
row[rowIndex][k] = true;
column[columnIndex][k] = true;
unit[(rowIndex/3)*3 + columnIndex/3][k] = true;

//递归写入下一个数
if (findTheResult(board, row, column, unit, rowIndex, columnIndex)) {
return true;
} else {
//失败,复位本次的写入结果
board[rowIndex][columnIndex] = '.';
row[rowIndex][k] = false;
column[columnIndex][k] = false;
unit[(rowIndex/3)*3 + columnIndex/3][k] = false;
}
}
return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: