个人记录-LeetCode 37. Sudoku Solver

来源:互联网 发布:淘宝女鞋品牌 编辑:程序博客网 时间:2024/06/11 20:15

问题:
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;    }}
0 0
原创粉丝点击