题解 | #暮光数独验证#

暮光数独验证

https://www.nowcoder.com/practice/68dd2d15263f433db6ffa0405d08426a

考察的知识点:哈希;

解答方法分析:

  1. 遍历每一行,使用一个布尔数组filled来记录当前行中出现的数字。如果当前位置的数字不是空格,并且不是1-9的数字,或者已经在该行中出现过,都返回false。如果该数字是合法的,将其在filled数组中对应的位置标记为已填充。
  2. 遍历每一列,使用类似的方法检查每一列是否合法。
  3. 遍历每一个小九宫格,使用类似的方法检查每一个小九宫格是否合法。
  4. 如果在遍历过程中发现任何不合法的情况,立即返回false。如果所有的遍历都通过了,返回true,表示数独是合法的。

所用编程语言:C++;

完整编程代码:↓

class Solution {
  public:
    bool isValidTwilightSudoku(vector<vector<char> >& board) {
        for (int i = 0; i < 9; i++) {
            vector <bool> filled(9, false);
            for (int j = 0; j < 9; j++) {
                if (board[i][j] != '.') {
                    if (!isdigit(board[i][j]) || filled[board[i][j] - '1']) {
                        return false;
                    }
                    filled[board[i][j] - '1'] = true;
                }
            }
        }
        for (int j = 0; j < 9; j++) {
            vector<bool> filled(9, false);
            for (int i = 0; i < 9; i++) {
                if (board[i][j] != '.') {
                    if (!isdigit(board[i][j]) || filled[board[i][j] - '1']) {
                        return false;
                    }
                    filled[board[i][j] - '1'] = true;
                }
            }
        }
        for (int k = 0; k < 9; k++) {
            int startRow = (k / 3) * 3;
            int startCol = (k % 3) * 3;
            vector<bool> filled(9, false);
            for (int i = startRow; i < startRow + 3; i++) {
                for (int j = startCol; j < startCol + 3; j++) {
                    if (board[i][j] != '.') {
                        if (!isdigit(board[i][j]) || filled[board[i][j] - '1']) {
                            return false;
                        }
                        filled[board[i][j] - '1'] = true;
                    }
                }
            }
        }
        return true;
    }
};

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务