锦绣育才【集训题】原原园长的九宫格

描述

原原园长非常喜欢数独,她开了一个数独的兴趣班,并尝试出题。
这次原原园长出的数独游戏规则是:将一个 9×9 的正方形区域划分为 9 个 3×3 的正方形宫位,要求 1 到 9 这九个数字中的每个数字在每一行、每一列、每个3×3 的小正方形中都只能出现一次。

现在原原园长出了一些题目的答案,想让你来验证下,每次她出的题答案是否正确。

输入描述

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

输出描述

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

用例输入 1

3
5 1 9 2 8 3 4 6 7
7 2 8 9 6 4 3 5 1
3 4 6 5 7 1 9 2 8
8 9 2 1 4 5 7 3 6
4 7 3 6 2 8 1 9 5
6 5 1 7 3 9 2 8 4
9 3 4 8 1 6 5 7 2
1 6 7 3 5 2 8 4 9
2 8 5 4 9 7 6 1 3
8 2 5 4 9 7 1 3 6
7 9 6 5 1 3 8 2 4
3 4 1 6 8 2 7 9 5
6 8 4 2 7 1 3 5 9
9 1 2 8 3 5 6 4 7
5 3 7 9 6 4 2 1 8
2 7 9 1 5 8 4 6 3
4 5 8 3 2 6 9 7 1
1 6 3 7 4 9 5 8 3
8 2 5 4 9 7 1 3 6
7 9 6 5 1 3 8 2 4
3 4 1 6 8 2 7 9 5
6 8 4 2 7 1 3 5 9
9 1 2 8 3 5 6 4 7
5 3 7 9 6 4 2 1 8
2 7 9 1 5 8 4 6 3
4 5 8 3 2 6 9 7 1
1 6 3 7 4 9 5 8 2
用例输出 1

1
0
1

#include <iostream>
using namespace std;
bool checkR(int sudoku[9][9], int row) {
    bool used[10] = {false};
    for (int col = 0; col < 9; col++) {
        int num = sudoku[row][col];
        if (used[num]) {
            return false;
        }
        used[num] = true;
    }
    return true;
}
bool checkC(int sudoku[9][9], int col) {
    bool used[10] = {false};
    for (int row = 0; row < 9; row++) {
        int num = sudoku[row][col];
        if (used[num]) {
            return false;
        }
        used[num] = true;
    }
    return true;
}
bool checkB(int sudoku[9][9], int startRow, int startCol) {
    bool used[10] = {false};
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
            int num = sudoku[startRow + row][startCol + col];
            if (used[num]) {
                return false;
            }
            used[num] = true;
        }
    }
    return true;
}
bool checkS(int sudoku[9][9]) {
    for (int row = 0; row < 9; row++) {
        if (!checkR(sudoku, row)) {
            return false;
        }
    }
    for (int col = 0; col < 9; col++) {
        if (!checkC(sudoku, col)) {
            return false;
        }
    }
    for (int startRow = 0; startRow < 9; startRow += 3) {
        for (int startCol = 0; startCol < 9; startCol += 3) {
            if (!checkB(sudoku, startRow, startCol)) {
                return false;
            }
        }
    }
    return true;
}
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int sudoku[9][9];
        for (int row = 0; row < 9; row++) {
            for (int col = 0; col < 9; col++) {
                cin >> sudoku[row][col];
            }
        }
        if (checkS(sudoku)) {
            cout << 1 << endl;
        } else {
            cout << 0 << endl;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༺ཌༀ傲世万物ༀད༻

你的鼓励奖是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值