在我开始编码之前,我仍然试图理解构建这个程序的步骤 . 我在网上找到了这个例子http://practicecprogram.blogspot.com/2014/10/c-program-to-find-out-if-solved-sudoku.html
有几个问题我还是不明白 .
1对于我的程序,我得到一个文本文件,第一个数字是一个数字,表示它包含多少个数独的解决方案 . 我几乎理解如何检查一个解决方案,但必须为N个解决方案做这个,并使程序适用于多个数独解决方案让我困惑 . 特别是在制作我的2d数组的值 . 对于许多N组,我的输出在新线上应该只是“是”或“否” .
2是否检查所有行和列的总和为45且值> 0,<10足以证明解决方案有效?我假设因为每个谜题只有一个解决方案我不必检查每个3x3网格,使其不包含重复,如果每行和列总和为45 .
3 回答
1)简单:
2)行/列中的总和或所有单元格等于45,所有数字都在1到9的范围内 . 这是否足以仅检查行和列以表明整个拼图有效?
是的 . 即使你试图愚弄你的检查员并且会给它排一行,比如说有两个六和两个九,没有七和八,这会破坏对某些列的检查 .
您的问题陈述缺少输入 . 该示例假设输入了每个游戏的解决方案,但在#1中,您声明唯一的输入是要解决的游戏数量 . 每个游戏解决方案都必须有数据来源 . 让我们假设每个游戏都有另一个文件 . 您的程序需要阅读每个游戏解决方案,验证解决方案,并简单地报告通过或失败的结果 . 需要重新编码示例代码以接受基于文件的输入,但不需要立即将所有解决方案保留在内存中 .
数独的另一个规则是行或列中的每个数字只能出现一次 . 只计算每行或每列的总数不会捕获重复项 .
1)一次处理一个拼图 . 将拼图读入阵列 . 核实 . 然后将下一个谜题读入同一个数组 . 如果您只想为所有谜题共同使用一个是/否,则可以打印否,并在任何检查失败后立即退出 . 如果你在没有任何失败检查的情况下完成它,那么打印是 . 如果你需要打印是否通过了个别谜题,那么在继续下一个谜题之前回答 .
2)没有!绝对不 . 一个简单的例子是充满了所有5的数独 . 这将为每个块,行和列提供45的总和,但显然是不正确的 . 仅检查行和列中每个数字的存在也是不够的 . 例如,考虑在第一行填充1 - 9 . 每个连续的行是前一行的左旋转 . 这将给出每行和每列中的所有数字,但这些块将是错误的,例如块0,0将是123,234,456 .
检查每个数字的一种(可能是最好的)方法是设置一个标志数组 . 每个索引代表拼图中的数字 . 扫描线(或行或块)并在到达时为每个数字设置标记 . 然后检查以确保设置了所有标志 . 检查一行: