Valid Sudoku

题目:

检测某个给出的数独谜题是否合法。输入时空格用 '.' 代替。

应当注意的是合法不意味着可解。只需要保证最初给定的数字不违反数独的规则即可。

解法:

用三个ArrayList存储行、列与小块中出现过的数字,出现过的置为1,否则置为0。由计算易知 i 行 j 列的数字在第 i / 3 行,第 j / 3 列的小块上(舍去小数)。

代码摘抄:

public class ValidSudoku {
    public boolean isValidSudoku(char[][] board) {
       
       //如果输入数据不足以构成数独则返回false
        if (board==null|| board.length!=9 || board[0].length!=9){
            return false;
        }
       
       //添加三个ArrayList,分别用来判断行、列与三乘三的小块是否合法
       ArrayList<boolean[]> Row = new ArrayList<boolean[]>();
       ArrayList<boolean[]> Col = new ArrayList<boolean[]>();
       ArrayList<boolean[]> Block = new ArrayList<boolean[]>();
       
       //九行、九列与九小块
       for (int i=0; i<9; i++){
           Row.add(new boolean[9]);
           Col.add(new boolean[9]);
           Block.add(new boolean[9]);
       }
       
       for (int i=0; i<9; i++){
           for (int j=0; j<9; j++){
              
              //如果选定位置是空的则跳过
              if (board[i][j]=='.'){
                  continue;
              }
              
              //将 c 定义为 i 行 j 列对应数字在数列中的位置
              int c = board[i][j]-'1' ;
              
              //如果下列中有一个为true,则证明对应的数字曾出现过,返回false
              if (Row.get(j)[c]==true || Col.get(i)[c]==true || Block.get(i/3*3+j/3)[c]==true){
                  return false;
              }
              else{
                  Row.get(j)[c] = true;
                  Col.get(i)[c] = true;
                  Block.get(i/3*3+j/3)[c] = true;
              }
           }
       }
       
       //所有条件都得到满足,返回true
       return true;
    }
}

 

posted @ 2017-11-06 00:33  望山海  阅读(138)  评论(0编辑  收藏  举报