首页 > 代码库 > [leetcode] Sudoku Solver

[leetcode] Sudoku Solver

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.

https://oj.leetcode.com/problems/sudoku-solver/

思路:类似于N-Queens的回溯方案,对于每个空格,依次填入每个数字,如果合法,继续下去,直至填满。

注意:此时isValid只需比较当前填入的值所在区域的合法性!

 

/** * http://blog.csdn.net/zxzxy1988/article/details/8586289 * http://blog.csdn.net/linhuanmars/article/details/20748761 * @author Dong Jiang * */public class Solution {    public void solveSudoku(char[][] board) {        solve(board);    }    public boolean solve(char[][] board) {        for (int i = 0; i < 9; i++) {            for (int j = 0; j < 9; j++) {                if (board[i][j] == ‘.‘) {                    for (int k = 1; k <= 9; k++) {                        board[i][j] = (char) (‘0‘ + k);                        if (isValid(board, i, j) && solve(board))                            return true;                        board[i][j] = ‘.‘;                    }                    return false;                }            }        }        return true;    }    private boolean isValid(char[][] board, int x, int y) {        int i, j;        for (i = 0; i < 9; i++)            if (i != x && board[i][y] == board[x][y])                return false;        for (j = 0; j < 9; j++)            if (j != y && board[x][j] == board[x][y])                return false;        for (i = 3 * (x / 3); i < 3 * (x / 3 + 1); i++)            for (j = 3 * (y / 3); j < 3 * (y / 3 + 1); j++)                if (i != x && j != y && board[i][j] == board[x][y])                    return false;        return true;    }    public static void main(String[] args) {        char[][] board = { { ‘5‘, ‘3‘, ‘.‘, ‘.‘, ‘7‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘ },                { ‘6‘, ‘.‘, ‘.‘, ‘1‘, ‘9‘, ‘5‘, ‘.‘, ‘.‘, ‘.‘ }, { ‘.‘, ‘9‘, ‘8‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘6‘, ‘.‘ },                { ‘8‘, ‘.‘, ‘.‘, ‘.‘, ‘6‘, ‘.‘, ‘.‘, ‘.‘, ‘3‘ }, { ‘4‘, ‘.‘, ‘.‘, ‘8‘, ‘.‘, ‘3‘, ‘.‘, ‘.‘, ‘1‘ },                { ‘7‘, ‘.‘, ‘.‘, ‘.‘, ‘2‘, ‘.‘, ‘.‘, ‘.‘, ‘6‘ }, { ‘.‘, ‘6‘, ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘2‘, ‘8‘, ‘.‘ },                { ‘.‘, ‘.‘, ‘.‘, ‘4‘, ‘1‘, ‘9‘, ‘.‘, ‘.‘, ‘5‘ }, { ‘.‘, ‘.‘, ‘.‘, ‘.‘, ‘8‘, ‘.‘, ‘.‘, ‘7‘, ‘9‘ } };        new Solution().solveSudoku(board);    }}

参考

http://blog.csdn.net/linhuanmars/article/details/20748761

http://blog.csdn.net/zxzxy1988/article/details/8586289