【leetcode】36-有效的数独【C++】

题目如下:

【leetcode】36-有效的数独【C++】_第1张图片

【leetcode】36-有效的数独【C++】_第2张图片

【leetcode】36-有效的数独【C++】_第3张图片

解题思路:

本题的核心就是确保:每一行中没有重复数字、每一列中没有重复数字、每个3 x 3 子数独内没有重复数字。简单思路即通过暴力求解遍历三次数独来求解,但实际上只需遍历一次数独即可:

  •        建立每个行、列、块的布尔类型映射表,映射表元素为真表示当前位置对应元素出现过,为假表示未出现过;
  •        之后逐行逐列遍历数独的元素,如果当前元素为非 “ . ” 元素,则根据其值减去 “ 1 ” 作为索引(因为数独的元素只可能是 1-9 的字符,所以将其减去字符 1 后即可作为索引下标),来查找对应的行、列、块映射表项是否为真;
  •        如果为真,则不是满足条件的数独;否者将其对应行、列、块映射表项置为真,继续遍历数独;
  •        遍历结束后,则表示数独有效,返回真。

数独元素对应块号的计算方法:block_index = (row / 3) * 3 + columns / 3

image.png

代码如下:

class Solution {
public:
    bool isValidSudoku(vector>& board) {
        vector> row(9, vector(9, false)); //记录行,默认初始化9个元素全为false
        vector> col(9, vector(9, false)); //记录列,默认初始化9个元素全为false
        vector> block(9, vector(9, false)); //记录块,默认初始化9个元素全为false
        for(int i = 0; i < 9; i++){
            for(int j = 0; j < 9; j++){
                if(board[i][j] != '.'){
                    int block_num = i / 3 * 3 + j / 3; //计算块号
                    int num = board[i][j] - '1'; //计算当前元素的索引大小
                    //元素在对应的行/列/块已出现过
                    if(row[i][num] || col[num][j] || block[block_num][num])
                        return false;
                    //元素在对应的行/列/块未出现过,那么将对应索引下标的行/列/块元素置为true
                    else{
                        row[i][num] = true;
                        col[num][j] = true;
                        block[block_num][num] = true;
                    }
                }
            }
        }
        return true;
    }
};

【leetcode】36-有效的数独【C++】_第4张图片

 

你可能感兴趣的:(leetcode算法题库)