当前位置: 首页 > 知识库问答 >
问题:

检查数独板的有效性。C程序

归俊捷
2023-03-14

我目前正在创建一个项目,检查给定的9x9数独表是否遵循数独规则。该表存储在一个多维数组中(board[9][9]),我一直在研究如何正确检查每个3x3子网格中是否有重复的数字。我已经建立了0(空白)和9(最大值)之外的数字检查,以及每行和每列中重复的检查。我已经管理了两个create 4 nested for循环,成功地循环了每个3x3框,但我不确定如何检查框中的值是否重复。我对重复的定义是两个包含相同数字的单元格(在我的程序中保留为空白的零除外)。以下是我目前的代码。此代码检查每个3x3子网格第一列中的每个数字是否有效,但无法检查每个框的其他两列。

for(int x=0;x<9;x=x+3){                 //iterates through each 3x3 sub box going through each row. Temp B compares each value to all other values in box.
    for(y=0;y<9;y=y+3){
        for(j=x;j<x+3;j++){
            tempB = board[j][k];
                for(k=y;k<y+3;k++) {
                    for (z = x; z < x + 3; z++) {
                        if (z != j && tempB == board[z][k] && tempB != 0) {
                            return 0;
                        }
                    }
                }
        }
    }
}

共有1个答案

毋宪
2023-03-14

为什么从来没有人提供MCVE?

正如尤诺什建议的那样,您可以只计算数组中数字的出现次数。记住跳过空单元格(0)。

#include <stdio.h>

int board_noduplicates(int board[9][9]) 
{
    for (int x = 0; x < 9; x += 3) {
        for(int y = 0; y < 9; y += 3) {
            int count[10] = { 0 };
            for(int j = x; j < x + 3; ++j) {
                for(int k = y; k < y + 3; ++k) {
                    int cur = board[j][k];
                    if(cur > 0 && count[cur] > 0) {
                        return 0;
                    }
                    ++count[cur];
                }
            }
        }
    }
    return 1;
}

int main(void) 
{
    int board1[9][9] = {
        {1,2,3, 0,0,0, 4,5,6,},
        {0,0,0, 1,0,0, 0,0,0,},
        {0,0,0, 0,0,8, 0,0,0,},

        {4,5,6, 2,0,0, 7,8,9,},
        {0,0,0, 0,1,0, 0,0,0,},
        {0,0,0, 0,0,3, 0,0,0,},

        {7,8,9, 4,0,0, 1,2,3,},
        {0,0,0, 0,5,0, 0,0,0,},
        {0,0,0, 0,0,6, 0,0,0,},
    };
    int board2[9][9] = {
        {1,2,3, 0,0,0, 4,5,6,},
        {0,0,0, 1,0,0, 0,0,0,},
        {0,0,0, 0,0,8, 0,0,0,},

        {4,5,6, 2,0,0, 7,8,9,},
        {0,0,0, 0,1,0, 0,0,0,},
        {0,0,5, 0,0,3, 0,0,0,}, // <-- duplicate

        {7,8,9, 4,0,0, 1,2,3,},
        {0,0,0, 0,5,0, 0,0,0,},
        {0,0,0, 0,0,6, 0,0,0,},
    };  
    
    printf("board_noduplicates(board1) -> %d\n", board_noduplicates(board1));
    printf("board_noduplicates(board2) -> %d\n", board_noduplicates(board2));
    
    return 0;
}
 类似资料:
  • 问题内容: 如何检查shell脚本中IP地址的有效性,该范围在to 的范围内? 问题答案: 如果您使用的是bash,则可以对模式进行简单的正则表达式匹配,而无需验证四边形: 如果您坚持使用POSIX Shell,则可以使用BRE而不是ERE来做基本相同的事情: 请注意,假设您的正则表达式锚定在字符串的左侧,因此不需要缩写。 如果确认每个四边形小于256很重要,那么显然您将需要更多代码: 甚至更少的

  • 问题内容: 我很好奇,用Java 创建对象的最明显的方法已被弃用,并且似乎已被使用宽大日历的不太明显的方法“替代”。 如何检查以日,月和年的组合形式给出的日期是否为有效日期? 例如,2008-02-31(如yyyy-mm-dd)将是无效日期。 问题答案: 当前的方法是使用日历类。它具有setLenient方法,该方法将验证日期和引发异常,如果超出示例,则抛出异常。 忘记添加:如果您获得日历实例并使

  • 让我们得到一个m位消息,其中最后n位是CRC位。据我所知,为了检查接收是否正确,我们应该用特定CRC算法的多项式对所有m位进行异或。如果结果是全零,我们可以说没有错误。

  • 我正在用python为我的CIS类做作业。我们得给数独棋盘编码。在9x9电路板中,我们显然必须检查每一行、col和3x3正方形是否存在重复项。我对如何用3x3的正方形来检查数字的想法有点固执。下面是我检查每一行和每一列的代码,如果有人能帮我一点轮廓或一种方法,那就是检查每一个3x3的正方形,这将是惊人的!

  • 我正在尝试在python中创建一个数独检查器: 我期待这样的输入——一个9个列表的列表。零表示用户尚未填写的数字。它们可以在一行、一列或3x3中多次出现。 我显然需要检查是否有一个9x9列表(网格),以及每行、每列和3x3小正方形中是否没有重复项。在代码中,我首先检查行数是否正确(应该有9行)。然后我检查每一行中是否有9个元素(在病态示例中,您可以看到情况并非如此)。然后我尝试检查每一行中的重复项

  • 问题内容: 尝试使应用程序启动默认浏览器访问URL,但前提是输入的URL有效,否则将显示一条消息,指出URL无效。 我将如何使用Swift检查有效性? 问题答案: 如果您的目标是验证应用程序是否可以打开URL,则可以执行以下操作。尽管Safari浏览器可以打开URL,但该网站可能不存在或可能已关闭。 作为一个方面说明,这并 不能 检查URL是否是有效或完整。例如,通过“ https://”的调用将