L-104九宫格

九宫格是一款数字游戏,传说起源于河图洛书,现代数学中称之为三阶幻方。游戏规则是:将一个 9×9 的正方形区域划分为 9 个 3×3 的正方形宫位,要求 1 到 9 这九个数字中的每个数字在每一行、每一列、每个宫位中都只能出现一次。

本题并不要求你写程序解决这个问题,只是对每个填好数字的九宫格,判断其是否满足游戏规则的要求。

输入格式:

输入首先在第一行给出一个正整数 n≤10),随后给出 n 个填好数字的九宫格。每个九宫格分 9 行给出,每行给出 9 个数字,其间以空格分隔。

输出格式:

对每个给定的九宫格,判断其中的数字是否满足游戏规则的要求。满足则在一行中输出 1,否则输出 0。

#include <stdio.h>

// 检查行和列是否有重复数字
int checkRowColumn(int map[9][9]) {
    for (int i = 0; i < 9; i++) {  // 遍历每一行和每一列
        int flagRow[10] = {0}, flagCol[10] = {0};  // 初始化标记数组
        for (int j = 0; j < 9; j++) {  // 遍历当前行和列
            if (flagRow[map[i][j]] || flagCol[map[j][i]])  // 如果当前数字已经出现过
                return 0;  // 返回 0,表示无效
            flagRow[map[i][j]] = 1;  // 标记当前数字已出现
            flagCol[map[j][i]] = 1;  // 标记当前数字已出现
        }
    }
    return 1;  // 返回 1,表示有效
}

// 检查每个 3x3 小宫格是否有重复数字
int checkSubgrid(int map[9][9]) {
    for (int ii = 0; ii < 9; ii += 3) {  // 遍历每个小宫格的起始行
        for (int jj = 0; jj < 9; jj += 3) {  // 遍历每个小宫格的起始列
            int flag[10] = {0};  // 初始化标记数组
            for (int i = ii; i < ii + 3; i++) {  // 遍历当前小宫格的行
                for (int j = jj; j < jj + 3; j++) {  // 遍历当前小宫格的列
                    if (flag[map[i][j]])  // 如果当前数字已经出现过
                        return 0;  // 返回 0,表示无效
                    flag[map[i][j]] = 1;  // 标记当前数字已出现
                }
            }
        }
    }
    return 1;  // 返回 1,表示有效
}

int main() {
    int n;
    scanf("%d", &n);  // 输入测试用例的数量
    int map[9][9];    // 定义一个 9x9 的数独矩阵

    while (n--) {  // 对每个测试用例进行处理
        int hasError = 0;  // 用于标记输入是否合法
        for (int i = 0; i < 9; i++) {  // 遍历每一行
            for (int j = 0; j < 9; j++) {  // 遍历每一列
                scanf("%d", &map[i][j]);  // 输入数独的每个数字
                if (map[i][j] <= 0 || map[i][j] >= 10)  // 如果数字不在 1-9 范围内
                    hasError = 1;  // 标记为错误
            }
        }
        if (hasError) {  // 如果输入不合法
            printf("0\n");  // 直接输出 0
            continue;       // 跳过后续检查
        }

        // 检查行、列和小宫格是否有效
        int isValid = checkRowColumn(map) && checkSubgrid(map);
        printf("%d\n", isValid);  // 输出检查结果
    }
    return 0;
}
  • continue:跳过当前测试用例的后续检查,直接进入 while 循环的下一次迭代(即处理下一个测试用例)。
全部评论

相关推荐

nus22016021404:兄弟,你这个简历撕了丢了吧,就是一坨,去找几个项目,理解项目流程,看几遍就是你的了,看看八股就去干了,多看看牛客里别人发出来的简历,对着写,你这写的啥啊,纯一坨
点赞 评论 收藏
分享
06-02 15:17
门头沟学院 Java
心爱的idea:怎么会呢 应该是打招呼有问题 问就说实习6个月全国可飞随时到岗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务