我正在编写一个sudoku /row验证器,所做的是:
8 2 1 3 6 4 9 7 5的内容。请注意,此程序的唯一目的是验证指定的sudoku列/行,而不是完全验证它。也就是检查每个sudoku块。
如何改进我的代码?我相信它有很多地方,命名惯例,基本的approach...etc..etc。
#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;
}发布于 2019-10-25 18:53:17
首先,我只想指出,这是对std::bitset<>的出色使用!此外,我只是想补充一下eanmos的评论。
命名的常量
除了如前所述,strIsValid()应该返回一个bool这一事实之外,您还定义了常数Constants::STR_YES和Constants::STR_NO。这些常量的输入时间比文字"YES"和"NO"长。另外,请考虑您将永远更改STR_YES的值。代码的编写假定常量是字面的"YES",因为它的名称很清楚,但是现在您正在打破这个假设。所以在main()里,我只想写:
std::cout << sudokuInstance.strIsValid() ? "YES\n" : "NO\n";如果目标是使翻译程序变得容易,那么您应该使用所谓的国际化库来实现这一点,比如gettext。对于有大量文本的程序,编写这样的常量是不合适的。
main()返回有意义的值
您的程序输出每个Sudoku实例是否对标准输出有效,但退出代码始终为0。如果发生错误,则自定义退出代码为非零。虽然从技术上讲,如果您将程序喂给无效的Sudoku,它仍然运行得非常好,但如果遇到任何无效的Sudoku,则可以考虑返回1。这与一些命令行工具所做的类似,比如cmp或grep -q。这样,您就可以从shell脚本中调用您的程序,并让shell脚本以一种简单的方式对程序的结果做出反应,从而很容易将其集成到更大的项目中。
https://codereview.stackexchange.com/questions/231286
复制相似问题