LeetCode程序员面试金典:解数独

发布时间:2023-04-27 09:08:00

题目:

通过填充空间来解决数独问题,编写一个程序。

解法需要数独 遵循以下规则:

每行只能出现一次数字1-9。

每列只能出现一次数字1-9。

数字1-9只能出现在每个3x3宫,每个3x3宫以粗实线分隔。(请参考示例图)

数字已经在数独的空间中填充,空白格使用‘.'表示。

示例 1:

输入:board = [[[5”,“3”,.",".","七",".",".",".",".",",",".","."一","九","五",".",".","."],["."九","八",".",".",".","."六",".",",".",".",".","6",".",".",".","三",".",".","八".","三".",".","1",".",".",".","二".",".",".","六","."六",".",".",".",".","2","八"."],[".",".",".","4","一","九",".",".","五",".",".",".",".","八".",".","7","9"]"

输出:[[[“5”、“3”、“4”、“6”、“7”、“7”、“8”、“9”、“9”、“1”、“1”、“2”、“2”、“1”、“9”、“3”、“4”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“3”、“9”、“6”、“1”、“4”“2”、“3”、“4”、“2”、“2”、“6”、“8”、“5”、“3”、“3”、“7”、“7”、“1”、“3”、“3”、“9”、“2”、“4”、“8”、“5”、“6”、“6”、“1”、“1”、“5”、“3”、“7”、“7”、“2”、“2”、“8”、“7”、“7”、“4”、“4”、“1”、“9”“6”、“3”、“5”、“3”、“4”、“5”、“2”、“8”、“6”、“1”、“7”、“9”

说明:输入的数独如上图所示,唯一有效的解决方案如下:

代码实现:

class Solution { private boolean[][] line = new boolean[9][9]; private boolean[][] column = new boolean[9][9]; private boolean[][][][][][][][][] block = new boolean[3][3][9]; private boolean valid = false; private List<int[]> spaces = new ArrayList<int[]>(); public void solveSudoku(char[][] board) { for (int i = 0; i < 9; ++i) { for (int j = 0; j < 9; ++j) { if (board[i][j] == '.') { spaces.add(new int[]{i, j}); } else { int digit = board[i][j] - '0' - 1; line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true; } } } dfs(board, 0); } public void dfs(char[][] board, int pos) { if (pos == spaces.size()) { valid = true; return; } int[] space = spaces.get(pos); int i = space[0], j = space[1]; for (int digit = 0; digit < 9 && !valid; ++digit) { if (!valid; ++digit) { if (!line[i][digit] && !column[j][digit] && !block[i / 3][j / 3][digit]) { line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = true; board[i][j] = (char) (digit + '0' + 1); dfs(board, pos + 1); line[i][digit] = column[j][digit] = block[i / 3][j / 3][digit] = false; } } }}

上一篇 LeetCode面试题:合并两个有序数组
下一篇 oracle 多个with as

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题