首页 文章

数独检查程序C [关闭]

提问于
浏览
-3

在我开始编码之前,我仍然试图理解构建这个程序的步骤 . 我在网上找到了这个例子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 回答

  • 0

    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)行/列中的总和或所有单元格等于45,所有数字都在1到9的范围内 . 这是否足以仅检查行和列以表明整个拼图有效?

    是的 . 即使你试图愚弄你的检查员并且会给它排一行,比如说有两个六和两个九,没有七和八,这会破坏对某些列的检查 .

  • 0
    • 您的问题陈述缺少输入 . 该示例假设输入了每个游戏的解决方案,但在#1中,您声明唯一的输入是要解决的游戏数量 . 每个游戏解决方案都必须有数据来源 . 让我们假设每个游戏都有另一个文件 . 您的程序需要阅读每个游戏解决方案,验证解决方案,并简单地报告通过或失败的结果 . 需要重新编码示例代码以接受基于文件的输入,但不需要立即将所有解决方案保留在内存中 .

    • 数独的另一个规则是行或列中的每个数字只能出现一次 . 只计算每行或每列的总数不会捕获重复项 .

  • 0

    1)一次处理一个拼图 . 将拼图读入阵列 . 核实 . 然后将下一个谜题读入同一个数组 . 如果您只想为所有谜题共同使用一个是/否,则可以打印否,并在任何检查失败后立即退出 . 如果你在没有任何失败检查的情况下完成它,那么打印是 . 如果你需要打印是否通过了个别谜题,那么在继续下一个谜题之前回答 .

    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;
    

相关问题