36. Valid Sudoku

来源:互联网 发布:柱状图数据ae模板 编辑:程序博客网 时间:2024/06/16 08:52

36. Valid Sudoku

题目

依据数独问题——规则Sudoku Puzzles - The Rules 来判断一个数独是否合法。
数独可以被部分填充,空的单元用字符‘.’来填充。
有效数独
部分填充的有效数独。

注:
有效的(部分填充的)数独不必全部解出来。只要验证已填充的单元是有效的就可以。

代码块

public class Solution {    static boolean isValidSudoku(char[][] board) {        if(checkRow(board) && checkCol(board) && checkSub(board))             return true;        return false;    }    static boolean checkRow(char[][] board) {        for(int i = 0; i < 9; i++){            HashSet<Character> hs = new HashSet<Character>();            for(int j = 0; j < 9; j++){                if(board[i][j] != '.'){                    if(hs.contains(board[i][j]))                        return false;                    else{                        hs.add(board[i][j]);                    }                }            }        }        return true;    }    static boolean checkCol(char[][] board){        for(int i = 0; i < 9; i++){            HashSet<Character> hs = new HashSet<Character>();            for(int j = 0; j < 9; j++){                if(board[j][i] != '.'){                    if(hs.contains(board[j][i])){                        return false;                    }else{                        hs.add(board[j][i]);                    }                   }            }        }        return true;    }    static boolean checkSub(char[][] board){        for(int k = 0; k < 9 ; k++){            int row = (k / 3) * 3;            int col = (k % 3) * 3;            HashSet<Character> hs = new HashSet<Character>();            for(int i = 0; i < 3; i++){                for(int j = 0; j < 3; j++){                    if(board[row + i][col + j] != '.'){                        if(hs.contains(board[row + i][col + j])){                            return false;                        }else{                            hs.add(board[row + i][col + j]);                        }                       }                }            }        }        return true;    }    public static void main(String[] args) {//        char[][] board = {//                {'.','.','.','.','5','.','.','1','.'},//                {'.','4','.','3','.','.','.','.','.'},//                {'.','.','.','.','.','3','.','.','1'},//                {'8','.','.','.','.','.','.','2','.'},//                {'.','.','2','.','7','.','.','.','.'},//                {'.','1','5','.','.','.','.','.','.'},//                {'.','.','.','.','.','2','.','.','.'},//                {'.','2','.','9','.','.','.','.','.'},//                {'.','.','4','.','.','.','.','.','.'}};//      char[][] board = {{'5', '5', '.', '.', '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'}};      char[][] board = {              {'.','.','4','.','.','.','6','3','.'},              {'.','.','.','.','.','.','.','.','.'},              {'5','.','.','.','.','.','.','9','.'},              {'.','.','.','5','6','.','.','.','.'},              {'4','.','3','.','.','.','.','.','1'},              {'.','.','.','7','.','.','.','.','.'},              {'.','.','.','5','.','.','.','.','.'},              {'.','.','.','.','.','.','.','.','.'},              {'.','.','.','.','.','.','.','.','.'}};        System.out.println(isValidSudoku(board));    }   }

代码分析

判断数独是否合法,需要判断每排,每列,每一个block是否合法,本题运用到了hashset,来判断是否是一个合法的数组。
首先需要看是否不等于’.’(因为空的不做判断),然后看是否包含重复的元素,
1)如果包括,就返回false,
2)如果不是,就添加到哈希集中。
判断每行,每列都是类似的方法,只是判断block时需要注意一下每个元素的索引。

k=0 (0,0) (0,1) (0,2) k=1 (0,3) (0,4) (0,5) k=2 (0,6) (0,7) (0,8) (1,0) (1,1) (1,2) (1,3) (1,4) (1,5) (1,6) (1,7) (1,8) (2,0) (2,1) (2,2) (2,3) (2,4) (2,5) (2,6) (2,7) (2,8) k=3 (3,0) (3,1) (3,2) (4,0) (4,1) (4,2) (5,0) (5,1) (5,2)

所以 int row = (k / 3) * 3;
int col = (k % 3) * 3;
[row + i ]
[col + j ]。

原创粉丝点击