题目

36. 有效的数独

题解



代码

public class code36 {
    public static boolean isValidSudoku(char[][] board) {
        // 记录某行,某位数字是否已经被摆放
        boolean row[][] = new boolean[9][10];
        // 记录某列,某位数字是否已经被摆放
        boolean col[][] = new boolean[9][10];
        // 记录某 3x3 宫格内,某位数字是否已经被摆放
        boolean block[][] = new boolean[9][10];

        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    int num = board[i][j] - '0';
                    int block_index = i / 3 * 3 + j / 3;
                    if (row[i][num] || col[j][num] || block[block_index][num]) {
                        return false;
                    } else {
                        row[i][num] = true;
                        col[j][num] = true;
                        block[block_index][num] = true;
                    }
                }
            }
        }
        return true;
    }

    public static void main(String[] args) {
        char a[][] = { { '.', '8', '7', '6', '5', '4', '3', '2', '1' }, { '2', '.', '.', '.', '.', '.', '.', '.', '.' },
                { '3', '.', '.', '.', '.', '.', '.', '.', '.' }, { '4', '.', '.', '.', '.', '.', '.', '.', '.' },
                { '5', '.', '.', '.', '.', '.', '.', '.', '.' }, { '6', '.', '.', '.', '.', '.', '.', '.', '.' },
                { '7', '.', '.', '.', '.', '.', '.', '.', '.' }, { '8', '.', '.', '.', '.', '.', '.', '.', '.' },
                { '9', '.', '.', '.', '.', '.', '.', '.', '.' } };
        boolean flag1 = isValidSudoku(a);
        System.out.println(flag1);

        char b[][] = { { '5', '3', '.', '.', '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' } };
        boolean flag2 = isValidSudoku(b);
        System.out.println(flag2);
    }
}

参考

  1. 有效的数独——题解一
  2. 哈希解决——题解二
  3. LeetCode - 有效的数独