Valid Sudoku

来源:互联网 发布:研究生课程表软件 编辑:程序博客网 时间:2024/06/06 19:04

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules .

The Sudoku board could be partially filled, where empty cells are filled with the character '.' .

A partially filled sudoku which is valid.

Note:

A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

注意到题目中说的,只要当前已经填充的数字是合法的就可以,不一定要这个数独是有解.(下面说的九宫格都是指3*3的网格)



在检测行是否合法时,i 表示矩阵的行,j 表示矩阵的列;

检测列是否合法时,i 表示矩阵的列,j 表示矩阵的行;

检测九宫格是否合法时,i 表示九宫格的标号,j 表示九宫格里的每个元素(只是我们需要根据i、j定位相应的元素到原来的矩阵: 第 i 个九宫格里面的第 j 个元素在原矩阵的第 3*(i/3) + j/3 行,第 3*(i%3) + j%3)列 ,“/” 表示整数除法)



public class Solution {
    public boolean isValidSudoku(char[][] board) {
//        int[] rowValid, columnValid, subBoardValid;   //variable rowValid might not have been initialized
        int[] rowValid = new int[10];              //用于验证行有效性,不同行可以重用
        int[] columnValid = new int[10];       //用于验证列有效性,不同列 可以重用
        int[] subBoardValid = new int[10];   //用于确定小九宫格有效性,不同个可以重用
        
        for(int i = 0; i < 9; i++){
            Arrays.fill(rowValid, 0);
            Arrays.fill(columnValid, 0);
            Arrays.fill(subBoardValid, 0);
            
            for(int j = 0; j < 9; j++) {
                if(!checkValid(rowValid, board[i][j] - '0') || !checkValid(columnValid, board[j][i] - '0') || !checkValid(subBoardValid, board[3*(i/3) + j/3][3*(i%3) + j%3] - '0')) 
                    return false;
            }
        }
        return true;
    }
    public boolean checkValid(int[] vec, int val) {
        if(val < 0) return true;                                //该方格内容为‘.’
        if(val > 9) return false;                 // 数值大于9无效
        
        if(vec[val] == 1) return false;  //将方格内值为数组索引
        vec[val] =1;                                //初始值为0,在此设置为1,若有重复则可经上一句if判断得出无效结果。
        return true;
    } 
}





关联内容http://write.blog.csdn.net/postedit

1 0
原创粉丝点击