通过编写暴力算法,每次取1e4的数据量进行一一检查,发现有重复项。
观察输出发现,这是在交换行的过程中出现的错误。对交换行代码进行检查。
代码错误最终确认在SudokuMaker.cpp 中的void generateFullSwappedRowSudoku(int level);函数,源代码为:
generateFullSwappedRowSudoku(level + 1);//不进行交换
swapRow(4, 5);
//showSudoku();
generateFullSwappedRowSudoku(level + 1);
swapRow(4, 6);
//showSudoku();
generateFullSwappedRowSudoku(level + 1);
swapRow(5, 6);
//showSudoku();
generateFullSwappedRowSudoku(level + 1);
swapRow(4, 5);
//showSudoku();
generateFullSwappedRowSudoku(level + 1);
swapRow(4, 6);
//showSudoku();
generateFullSwappedRowSudoku(level + 1);
添加了对其中的代码注释之后解决该问题。原因是在后续的输出中存在不交换即输出的函数,中间层的交换后立即输出与后续的不交换即输出产生了冲突,修改之后代码正确。
后在1e3和1e4内进行循环测试没有发现重复。相关代码可以参见集成测试项目中的RepeationTest.
可以合理认为测试是成功的。
首先生成一定数量的数独。数独问题生成器在集成测试项目(IntegrationTest项目)中的SudokuProblemMaker中。根据数独生成算法生成的数独文件读入挖空并输出得到不同1e3到1e6数量的数独问题。生成的问题上传至百度网盘。
对该数独进行求解,在测试过程中取消对数独检查代码(正式生成程序时为加快速度进行注释)的注释如下:
对其进行求解输出测试发现无误。
手动对输出进行检查即可。
用户有个需求不清楚,就是再最后一个数独之后是否有空行。自行理解输出如下:
详细测试已在单元测试中做过。GoogleTest的代码在gtest项目中。需要在debug模式下运行,release没有做配置。
通过一系列测试,测试通过。
原文:https://www.cnblogs.com/harrypotterjackson/p/12203564.html