数独棋盘程序 C
Sudoku Checker Program C
我正在尝试用 c 语言完成一个数独解决方案检查程序。在开始编码之前,我仍在尝试了解构建此程序的步骤。我在网上找到这个例子 http://practicecprogram.blogspot.com/2014/10/c-program-to-find-out-if-solved-sudoku.html
还有几个问题没看懂
1 对于我的程序,我得到了一个文本文件,第一个数字是一个数字,表示它包含多少组数独解决方案。我几乎理解如何只检查一个解决方案,但必须对 N 个解决方案进行检查,并使程序适用于多个数独解决方案,这让我感到困惑。特别是在为值制作二维数组时。无论多少 N 组,我的输出都应该在新的一行上只有 Yes 或 No。
2 是否检查所有行和列的总和为 45 并且值 >0、<10 足以证明解决方案有效?我假设因为每个谜题只有一个解决方案,所以如果每行和每列的总和为 45,我就不必检查每个 3x3 网格以使其不包含重复项。
- 您的问题陈述缺少输入。该示例假设输入了每个游戏的解决方案,但在#1 中您声明唯一的输入是要解决的游戏数量。每个游戏解决方案都必须有一个数据源。假设每个游戏都有另一个文件。您的程序需要读取每个游戏解决方案,验证解决方案,并简单地报告通过或失败作为结果。示例代码需要 re-coded 来接受 file-based 输入,但它不需要立即将所有解决方案保留在内存中。
- 数独的另一个规则是一行或一列中的每个数字只能出现一次。仅计算每行或每列的总数不会捕获重复项。
1) 简单:
/// Read the number of puzzles;
...
for (i = 0; i < number_of_puzzless; i++) {
// Read Data for a puzzle
...
// Process puzzle data
...
// Print result
...
}
2) row/column 中的总和或所有单元格等于 45,所有数字都在 1 到 9 的范围内。这是否足以仅检查行和列来说明整个拼图已验证?
是的。即使您试图欺骗您的检查器并给它一行,比如说,有两个六和两个九,没有七和八,这也会破坏某些列的检查。
1) 一次处理每个难题。将拼图读入数组。核实。然后将下一个拼图读入同一个数组。如果你只想要一个 yes/no 用于所有拼图,你可以打印 no 并在任何检查失败后立即退出。如果你在没有任何失败检查的情况下完成它,那么打印 yes。如果您需要打印单个拼图是否通过,请在继续下一个拼图之前回答。
2)不!绝对不。一个简单的例子是全 5 的数独游戏。这将为每个块、行和列提供 45 的总和,但显然是不正确的。仅检查行和列中每个数字的存在也是不够的。例如,考虑在第一行填充 1 - 9 的一个。每个连续的行都是前一行的左旋转。这将给出每一行和每一列中的所有数字,但是块将是错误的,例如块 0,0 将是 123,234,456。
检查每个数字的一种(也许是最好的)方法是设置一个标志数组。每个索引代表拼图中的那个数字。扫描行(或行或块)并在到达时为每个数字设置标志。然后检查以确保设置了所有标志。检查一行:
int i,col;
int flags[9];
//zero the flags
for(i 0 1; i < 9; i++)
flags[i] = 0;
//check row
for(col = 0; col < 9; col++)
flags[data[row][col] - '1'] = 1;
//check flags
for(i 0 1; i < 9; i++)
if( 0 == flags[i] )
fail = true;
我正在尝试用 c 语言完成一个数独解决方案检查程序。在开始编码之前,我仍在尝试了解构建此程序的步骤。我在网上找到这个例子 http://practicecprogram.blogspot.com/2014/10/c-program-to-find-out-if-solved-sudoku.html
还有几个问题没看懂
1 对于我的程序,我得到了一个文本文件,第一个数字是一个数字,表示它包含多少组数独解决方案。我几乎理解如何只检查一个解决方案,但必须对 N 个解决方案进行检查,并使程序适用于多个数独解决方案,这让我感到困惑。特别是在为值制作二维数组时。无论多少 N 组,我的输出都应该在新的一行上只有 Yes 或 No。
2 是否检查所有行和列的总和为 45 并且值 >0、<10 足以证明解决方案有效?我假设因为每个谜题只有一个解决方案,所以如果每行和每列的总和为 45,我就不必检查每个 3x3 网格以使其不包含重复项。
- 您的问题陈述缺少输入。该示例假设输入了每个游戏的解决方案,但在#1 中您声明唯一的输入是要解决的游戏数量。每个游戏解决方案都必须有一个数据源。假设每个游戏都有另一个文件。您的程序需要读取每个游戏解决方案,验证解决方案,并简单地报告通过或失败作为结果。示例代码需要 re-coded 来接受 file-based 输入,但它不需要立即将所有解决方案保留在内存中。
- 数独的另一个规则是一行或一列中的每个数字只能出现一次。仅计算每行或每列的总数不会捕获重复项。
1) 简单:
/// Read the number of puzzles;
...
for (i = 0; i < number_of_puzzless; i++) {
// Read Data for a puzzle
...
// Process puzzle data
...
// Print result
...
}
2) row/column 中的总和或所有单元格等于 45,所有数字都在 1 到 9 的范围内。这是否足以仅检查行和列来说明整个拼图已验证?
是的。即使您试图欺骗您的检查器并给它一行,比如说,有两个六和两个九,没有七和八,这也会破坏某些列的检查。
1) 一次处理每个难题。将拼图读入数组。核实。然后将下一个拼图读入同一个数组。如果你只想要一个 yes/no 用于所有拼图,你可以打印 no 并在任何检查失败后立即退出。如果你在没有任何失败检查的情况下完成它,那么打印 yes。如果您需要打印单个拼图是否通过,请在继续下一个拼图之前回答。
2)不!绝对不。一个简单的例子是全 5 的数独游戏。这将为每个块、行和列提供 45 的总和,但显然是不正确的。仅检查行和列中每个数字的存在也是不够的。例如,考虑在第一行填充 1 - 9 的一个。每个连续的行都是前一行的左旋转。这将给出每一行和每一列中的所有数字,但是块将是错误的,例如块 0,0 将是 123,234,456。
检查每个数字的一种(也许是最好的)方法是设置一个标志数组。每个索引代表拼图中的那个数字。扫描行(或行或块)并在到达时为每个数字设置标志。然后检查以确保设置了所有标志。检查一行:
int i,col;
int flags[9];
//zero the flags
for(i 0 1; i < 9; i++)
flags[i] = 0;
//check row
for(col = 0; col < 9; col++)
flags[data[row][col] - '1'] = 1;
//check flags
for(i 0 1; i < 9; i++)
if( 0 == flags[i] )
fail = true;