首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证sudoku列和行

验证sudoku列和行
EN

Code Review用户
提问于 2019-10-24 22:58:42
回答 1查看 231关注 0票数 6

我正在编写一个sudoku /row验证器,所做的是:

  1. 读取要验证的Sudoku实例的用户输入。
  2. 将sudoku矩阵网格9x9 (在我的具体例子中是9x9)读入2d数组。每一行读/行应该包含类似于:8 2 1 3 6 4 9 7 5的内容。
  3. 通过翻转9位集来验证每一行和每列,以测试所有列和行是否包含1-9中的num。

请注意,此程序的唯一目的是验证指定的sudoku列/行,而不是完全验证它。也就是检查每个sudoku块。

如何改进我的代码?我相信它有很多地方,命名惯例,基本的approach...etc..etc。

代码语言:javascript
复制
#include <iostream>
#include <sstream>
#include <bitset>

namespace Constants
{
    constexpr int ROW_COL_SIZE = 9;
    const std::string STR_YES = "YES";
    const std::string STR_NO = "NO";
}

template<unsigned int N>
class Sudoku
{
private:
    int m_matrix[N][N] {{0}};
public:
    void ReadRows();
    std::string strIsValid() const;
};

template<unsigned int N>void Sudoku<N>::ReadRows()
{
    for(unsigned int row{0}; row<N; row++)
    {
        static std::string line;
        std::getline(std::cin, line);
        std::istringstream issline(line);
        int readnum {0};
        for(unsigned int i{0}; i<N; i++)
        {
            issline >> readnum;
            m_matrix[row][i] = readnum;
        }
    }
}

template<unsigned int N>std::string Sudoku<N>::strIsValid() const
{
    //9bit default ctor all zeroes, 000000000
    std::bitset<N> bitRow[N];
    std::bitset<N> bitCol[N];
    for(int i{0}; i<N; i++)
    {
        for(int j{0}; j<N; j++)
        {
            bitRow[i].flip(m_matrix[i][j]-1); //verify nums 1-9 row, bitset index is 0 not 1.
            bitCol[i].flip(m_matrix[j][i]-1); //verify nums 1-9 col
        }
        if(!bitRow[i].all() && !bitCol[i].all())
        {
            return Constants::STR_NO;
        }
    }
    return Constants::STR_YES;
}

int main(int, char**)
{
    int instances {0};
    std::cin >> instances;
    std::cin.clear();
    std::cin.ignore();

    for(int i{0}; i<instances; i++)
    {
        std::cout << "Instance " << i+1 << std::endl;
        Sudoku<Constants::ROW_COL_SIZE> sudokuInstance;
        sudokuInstance.ReadRows();
        std::cout << sudokuInstance.strIsValid() << std::endl << std::endl;
    }

    return 0;
}
EN

回答 1

Code Review用户

发布于 2019-10-25 18:53:17

首先,我只想指出,这是对std::bitset<>的出色使用!此外,我只是想补充一下eanmos的评论。

不定义以值

命名的常量

除了如前所述,strIsValid()应该返回一个bool这一事实之外,您还定义了常数Constants::STR_YESConstants::STR_NO。这些常量的输入时间比文字"YES""NO"长。另外,请考虑您将永远更改STR_YES的值。代码的编写假定常量是字面的"YES",因为它的名称很清楚,但是现在您正在打破这个假设。所以在main()里,我只想写:

代码语言:javascript
复制
std::cout << sudokuInstance.strIsValid() ? "YES\n" : "NO\n";

如果目标是使翻译程序变得容易,那么您应该使用所谓的国际化库来实现这一点,比如gettext。对于有大量文本的程序,编写这样的常量是不合适的。

考虑从main()

返回有意义的值

您的程序输出每个Sudoku实例是否对标准输出有效,但退出代码始终为0。如果发生错误,则自定义退出代码为非零。虽然从技术上讲,如果您将程序喂给无效的Sudoku,它仍然运行得非常好,但如果遇到任何无效的Sudoku,则可以考虑返回1。这与一些命令行工具所做的类似,比如cmpgrep -q。这样,您就可以从shell脚本中调用您的程序,并让shell脚本以一种简单的方式对程序的结果做出反应,从而很容易将其集成到更大的项目中。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/231286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档