【Valid Sudoku】cpp

题目

Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

A partially filled sudoku which is valid.

Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.

代码

复制代码
class Solution {
public:
bool isValidSudoku(std::vector<std::vector<char> > &board)
        {
            int len = board.size();
            if (len != 9) return false;
            bool row_check[9];
            bool col_check[9];
            bool subBox_check[9];
            for (int row = 0; row < len; ++row)
            {
                std::fill(row_check, row_check+9, false);
                std::fill(col_check, col_check+9, false);
                std::fill(subBox_check, subBox_check+9, false);
                for (int col = 0; col < len; ++col)
                {
                    if (!Solution::if_valid(board, row, col, row_check)){
                        return false;
                    }
                    if (!Solution::if_valid(board, col, row, col_check)){
                        return false;
                    }
                    if (!Solution::if_valid(board, 3*(row/3)+col/3, 3*(row%3)+col%3, subBox_check)){
                        return false;
                    }
                }
            }
            return true;
        }
static bool if_valid(std::vector<std::vector<char> > &board, int x, int y, bool (&some_check)[9])
        {
            if (board[x][y]=='.'){
                return true;
            }
            else{
                if (some_check[board[x][y]-'1']){
                    return false;
                }
                else{
                    some_check[board[x][y]-'1'] = true;
                    return true;
                }
            }
            return false;
        }
};
复制代码

Tips

1. 整体逻辑按照数独的要求走:

  a. 判断同一行

  b. 判断同一列

  c. 判断所在的sub box

2. 判断时主要利用的数据结构是类似HashSet,由于三类判断条件类似,因此单独提出来一段代码。

3. 一点儿技巧:这里时间复杂度没有什么可说的就是O(n²);可以做些文章的地方就是代码复杂度,如何遍历一次for..for...就判断完成全部的逻辑。

  a. 这里的核心就在于数独是对称的矩阵,行列对称;因此,行列坐标互换就可以走一次for...for...就完成1.a和1.b的判断逻辑。

  b. 这里还需要注意的是,for..for..中走完一列,则需要判断一个sub box是否valid;因此,需要将某一列的坐标映射到某个sub box上。搞清楚这一点就可以推理处坐标变换的公式。

4. 在离线测试的时候,处理c++的 vector 二维字符数组还是非常不熟练,由Python转成cpp刷题确实不太习惯。后面在刷到string的题目时候,再把这cpp这部分强化一下。

==================================================

第二次过这道题,第一次没有AC还是错在了sub matrix小方块的检验上面。

复制代码
class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
            for ( int i=0; i<board.size(); ++i )
            {
                // check row
                vector<bool> row_used(9,false);
                for ( int j=0; j<board[i].size(); ++j )
                {
                    if ( board[i][j]!='.' )
                    {
                        if ( row_used[board[i][j]-'1'] ) return false;
                        row_used[board[i][j]-'1'] = true;
                    }
                }
                // check col
                vector<bool> col_used(9,false);
                for ( int j=0; j<board.size(); ++j)
                {
                    if ( board[j][i]!='.')
                    {
                        if ( col_used[board[j][i]-'1'] ) return false;
                        col_used[board[j][i]-'1'] = true;
                    }
                }
                // check sub matrix
                vector<bool> subm_used(9,false);
                for ( int j=0; j<board[i].size(); ++j )
                {
                    int row = 3*(i/3) + j/3;
                    int col = 3*(i%3) + j%3;
                    if ( board[row][col]!='.' )
                    {
                        if ( subm_used[board[row][col]-'1'] ) return false;
                        subm_used[board[row][col]-'1'] = true;
                    }
                }
            }
            return true;
    }
};
复制代码

tips:

这个要记住了
row = 3*(i/3) + j/3

col = 3*(i%3) + j%3

posted on   承续缘  阅读(220)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示