2015年6月29日星期一

Sudoku Solver leetcode

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...
与n皇后问题类似, 对于每个空格逐步添加数字, 不对了就回溯
如果对一个格子尝试从0~9都不行,那么说明整个sudoku无解,返回false
对整个棋盘所有'.'都填完了,返回true

public class Solution {
    public void solveSudoku(char[][] board) {
        if (board == null || board.length < 9 || board[0].length < 9) {
            return;
        }
        helper(board);
    }
    public boolean helper(char[][] board) {
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] == '.') {
                    for (char c = '1'; c <= '9'; c++) {
                        if (isValid(board, i, j, c)) {
                            board[i][j] = c;
                            if (helper(board)) {
                                return true;
                            } else {
                                board[i][j] = '.';
                            }
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }
    public boolean isValid(char[][] board, int i, int j, char c) {
        //check column
        for (int row = 0; row < 9; row ++) {
            if (board[row][j] == c) {
                return false;
            }
        }
        // check row
        for (int column = 0; column < 9; column++) {
            if (board[i][column] == c) {
                return false;
            }
        }
        //check block
        for (int row = i / 3 * 3; row < i / 3 * 3 + 3; row++) {
            for(int column = j / 3 * 3; column < j / 3 * 3 + 3; column++) {
                if (board[row][column] == c) {
                    return false;
                }
            }
        }
        return true;
    }
}
//
public class Solution {
    public void solveSudoku(char[][] board) {
        helper(board, 0, 0);
    }
    public boolean helper(char[][] board, int m, int n) {
        if (n >= 9) {
            return helper(board, m + 1, 0);
        }
        if (m == 9) {
            return true;
        }
        if (board[m][n] == '.') {
            for (int i = 1; i <= 9; i++) {
                board[m][n] = (char)(i + '0');
                if (isvalid(board, m, n)) {
                    if (helper(board, m, n+ 1)) {
                        return true;
                    }
                }
                board[m][n] = '.';
            }
        } else {
            return helper(board, m, n+ 1);
        }
        return false;
    }
    public boolean isvalid(char[][] board, int m, int n) {
        for (int i = 0; i < 9; i++) {
            if (i != m && board[i][n] == board[m][n]) {
                return false;
            }
        }
        for (int i = 0; i < 9; i++) {
            if (i != n && board[m][i] == board[m][n]) {
                return false;
            }
        }
        for (int i = m / 3 * 3; i< m / 3 * 3 + 3; i++) {
            for (int j = n /3 * 3; j < n / 3 *3 + 3; j++) {
                if (i != m && j != n && board[i][j] == board[m][n]) {
                    return false;
                }
            }
        }
        return true;
    }
}

没有评论:

发表评论