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; } }