L1-104 九宫格(2024PTA天梯赛)

L1-104 九宫格 - 团体程序设计天梯赛-练习集 (pintia.cn)

很基本的处理,但是很考察矩阵处理的基本功,尤其是在考试的时候,稍微思考不全面就会错

#include<bits/stdc++.h>  

using namespace std;
  
int mp[10][10], a[10], b[10];
// mp 用于存储九宫格的数字  
// a, b 用于检查每行和每列的数字是否重复  

int main() {
    int n;
    cin >> n; // 输入九宫格的数量  

    for (int z = 1; z <= n; z++) { // 对每一个九宫格进行处理  
        int isLegal = 0; // isLegal 用于标记九宫格是否满足要求,0表示满足,1表示不满足  

        // 读取九宫格的数字  
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= 9; j++) {
                cin >> mp[i][j];
            }
        }

        // 检查每行和每列的数字是否重复,并判断是否满足要求  
        for (int i = 1; i <= 9; i++) {
            isLegal = 0; // 重置 isLegal  
            memset(a, 0, sizeof(a)); // 清零数组 a  
            memset(b, 0, sizeof(b)); // 清零数组 b  

            // 统计每行和每列的数字出现的次数  
            for (int j = 1; j <= 9; j++) {
                a[mp[i][j]]++; // 统计每行的数字  
                b[mp[j][i]]++; // 统计每列的数字  
            }

            // 检查每行和每列的数字是否只出现一次  
            for (int k = 1; k <= 9; k++) {
                if (a[k] == 0 || b[k] == 0 || a[k] > 1 || b[k] > 1)  //因为是九宫格 每个数字必须要填有且不能大于1 所以如果某个数字为0也是非法
                {
                    isLegal = 1; // 如果有数字未出现或重复出现,则标记为不满足要求  
                    break;
                }
            }

            if (isLegal == 1) break; // 如果不满足要求,则退出循环,不再检查后续的行列  
        }

        int isLegalBox = 0; // isLegalBox 用于标记九宫格的每个3x3宫格是否满足要求  

        // 检查每个3x3宫格的数字是否重复,并判断是否满足要求  
        for (int x = 1; x <= 7; x += 3) { // x, y 表示每个3x3宫格的左上角坐标  
            for (int y = 1; y <= 7; y += 3) {
                memset(a, 0, sizeof(a)); // 清零数组 a  

                // 统计每个3x3宫格的数字出现的次数  
                for (int i = x; i < x + 3; i++)
                {
                    for (int j = y; j < y + 3; j++) 
                    {
                        a[mp[i][j]]++;
                    }
                }

                // 检查每个3x3宫格的数字是否只出现一次  
                for (int k = 1; k <= 9; k++)
                {
                    if (a[k] == 0 || a[k] > 1) 
                    {
                        isLegalBox = 1; // 如果有数字未出现或重复出现,则标记为不满足要求  
                        break;
                    }
                }

                if (isLegalBox == 1) break; // 对于当前的宫格,如果不满足要求,则退出循环,不再检查后续的3x3宫格  
            }
        }

        // 输出结果,如果九宫格满足要求,则输出 1,否则输出 0  
        if (isLegal == 1 || isLegalBox == 1) cout << "0" << '\n';
        else cout << "1" << '\n';
    }

    return 0; // 程序结束  
}

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值