最近偶尔有玩数独,有的题太复杂了不好解,刚好看到LeetCode上有这样的题,就尝试写了个Java的解法。
1. 数独介绍
数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。
左边是数独的题目,右边是完成后的结果。
2. 求解思路
2.1 方法定义与初始化
传入的是一个char[9][9]的数组,其中空白的部分用点号’.’代替,算出的解直接填进去即可。
public void solveSudoku(char[][] board)
我定义了一个Map<Integer, List<Character>> unsolve
,它的key是当前未得到解的格子下标(从左上角开始到右下角分别是0-80),它的value是该格子可能的数值。
定义了一个初始化方法,用于初始化上面的那个map,即将每个未得到解的格子的可能数字填入1-9这9个数字。
private Map<Integer, List<Character>> initUnsolveMap(char[][] board) {
Map<Integer, List<Character>> unsolve = new TreeMap<>();
final List<Character> initChars = Arrays.asList('1', '2', '3', '4', '5', '6', '7', '8', '9');
for (int y = 0; y < board.length; y++) {
char[] chars = board[y];
for (int x = 0; x < chars.length; x++) {
char aChar = chars[x];
if (aChar == '.') {
unsolve.put(y * 9 + x, new ArrayList<>(initChars));
}
}
}
return unsolve;
}
当这个map的某个key的值只有一个元素时&#x