算法入门——有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

  1. 数字 1-9 在每一行只能出现一次。
  2. 数字 1-9 在每一列只能出现一次。
  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次

在c++中解决这个问题可以通过使用三种数据结构分别判断每一行每一列和和每一个3x3矩阵是否有相同的数字,综上所述可以使用哈希表的方法(可以认为是一种暴力解法)

输入为一个矩阵board,类型为vector<vector<char>>

第一步,定义三个向量,向量中的元素为哈希表<int>,行row(9),列cols(9),3x3矩阵blocks(9)

第二步定义for循环行(int i=0;i<9;++i)列(int j=0;j<n;j++)

第三步 取出矩阵中的值board[i][j],判断其是否为‘.'若不是则转为int n,并计算矩阵的指针,一共也是从0到8,若是,则跳到第五步(此时n未变)

第四步,判断其是否在该行,该列,该矩阵出现过,若出现过,return false(循环结束)若不是跳转到下一步

第五步 将n存入该行,该列,该矩阵的哈希表中

第六步重回for循环,循环结束后return true

流程图为

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        // 使用数组来存储每行、每列和每个block的数字出现情况
        vector<unordered_set<int>> rows(9), cols(9), blocks(9);
        
        for (int i = 0; i < 9; i++) {  // 遍历行
            for (int j = 0; j < 9; j++) {  // 遍历列
                char num = board[i][j];
                if (num != '.') {  // 如果不是空格,则进行检查
                    int n = num - '0';  // 转换成整数
                    int block_index = (i / 3) * 3 + j / 3;  // 计算3x3宫格的索引
                    
                    // 检查行、列、宫格是否已经有这个数字
                    if (rows[i].count(n) || cols[j].count(n) || blocks[block_index].count(n)) {
                        return false;  // 如果有重复,则不是有效的数独
                    }
                    // 在行、列、宫格中标记这个数字已出现
                    rows[i].insert(n);
                    cols[j].insert(n);
                    blocks[block_index].insert(n);
                }
            }
        }
        return true;  // 如果没有发现任何重复,那么这是一个有效的数独
    }
};

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值