P10228 [COCI 2023/2024 #4] Bingo

· · 题解

思路

这道题我们可以用结构体来做。

struct Node{
    std::string name;
    int matrix[10][10];
    bool check[10][10];
    bool isOk=0;
}p[55];

上面是一个结构体:

判断一个玩家可不可以喊出 Bingo!,我们可以直接判断每行每列和两个对角线是否都是主持人报出的数字。

bool mycheck(bool p[10][10]){
    if(p[1][1]&&p[1][2]&&p[1][3]&&p[1][4]&&p[1][5])return true;
    if(p[2][1]&&p[2][2]&&p[2][3]&&p[2][4]&&p[2][5])return true;
    if(p[3][1]&&p[3][2]&&p[3][3]&&p[3][4]&&p[3][5])return true;
    if(p[4][1]&&p[4][2]&&p[4][3]&&p[4][4]&&p[4][5])return true;
    if(p[5][1]&&p[5][2]&&p[5][3]&&p[5][4]&&p[5][5])return true;
    if(p[1][1]&&p[2][1]&&p[3][1]&&p[4][1]&&p[5][1])return true;
    if(p[1][2]&&p[2][2]&&p[3][2]&&p[4][2]&&p[5][2])return true;
    if(p[1][3]&&p[2][3]&&p[3][3]&&p[4][3]&&p[5][3])return true;
    if(p[1][4]&&p[2][4]&&p[3][4]&&p[4][4]&&p[5][4])return true;
    if(p[1][5]&&p[2][5]&&p[3][5]&&p[4][5]&&p[5][5])return true;
    if(p[1][1]&&p[2][2]&&p[3][3]&&p[4][4]&&p[5][5])return true;
    if(p[1][5]&&p[2][4]&&p[3][3]&&p[4][2]&&p[5][1])return true;
    return false;
}

接下来输入每个玩家的信息。

int n;std::cin>>n;
for(int i=1;i<=n;i++){
 //p数组是 Node 类型的
    std::cin>>p[i].name;
    for(int j=1;j<=5;j++)
        for(int k=1;k<=5;k++)
            std::cin>>p[i].matrix[j][k];
}

用一个 unordered_map 记录下主持人报出的数字。

std::unordered_map<int,bool>mp;

 ...

int m;std::cin>>m;
for(int i=1;i<=m;i++){
    int x;std::cin>>x;
    mp[x]=true;
}

接下来处理 check 数组,遍历 matrix 数组,如果 matrix_{i,j} 是主持人报出的数字,将 check_{i,j} 就设为 1,再使用 mycheck 函数判断。

for(int k=1;k<=n;k++)
    for(int i=1;i<=5;i++)
        for(int j=1;j<=5;j++)
            if(mp[p[k].matrix[i][j]])
                p[k].check[i][j]=true;
for(int i=1;i<=n;i++){
    p[i].isOk=mycheck(p[i].check);
    if(p[i].isOk)cnt++;//记录有多少个人可以喊出 bingo
}

最后按照题目意思输出。

代码

#include<iostream>
#include<unordered_map>
struct Node{
    std::string name;
    int matrix[10][10];
    bool check[10][10];
    bool isOk=0;
}p[55];
std::unordered_map<int,bool>mp;
int cnt=0;
bool mycheck(bool p[10][10]){
    if(p[1][1]&&p[1][2]&&p[1][3]&&p[1][4]&&p[1][5])return true;
    if(p[2][1]&&p[2][2]&&p[2][3]&&p[2][4]&&p[2][5])return true;
    if(p[3][1]&&p[3][2]&&p[3][3]&&p[3][4]&&p[3][5])return true;
    if(p[4][1]&&p[4][2]&&p[4][3]&&p[4][4]&&p[4][5])return true;
    if(p[5][1]&&p[5][2]&&p[5][3]&&p[5][4]&&p[5][5])return true;
    if(p[1][1]&&p[2][1]&&p[3][1]&&p[4][1]&&p[5][1])return true;
    if(p[1][2]&&p[2][2]&&p[3][2]&&p[4][2]&&p[5][2])return true;
    if(p[1][3]&&p[2][3]&&p[3][3]&&p[4][3]&&p[5][3])return true;
    if(p[1][4]&&p[2][4]&&p[3][4]&&p[4][4]&&p[5][4])return true;
    if(p[1][5]&&p[2][5]&&p[3][5]&&p[4][5]&&p[5][5])return true;
    if(p[1][1]&&p[2][2]&&p[3][3]&&p[4][4]&&p[5][5])return true;
    if(p[1][5]&&p[2][4]&&p[3][3]&&p[4][2]&&p[5][1])return true;
    return false;
}
int main(){
    int n;std::cin>>n;
    for(int i=1;i<=n;i++){
        std::cin>>p[i].name;
        for(int j=1;j<=5;j++)
            for(int k=1;k<=5;k++)
                std::cin>>p[i].matrix[j][k];
    }
    int m;std::cin>>m;
    for(int i=1;i<=m;i++){
        int x;std::cin>>x;
        mp[x]=true;
    }
    if(m<5){
        std::cout<<0;
        return 0;
    }
    for(int k=1;k<=n;k++)
        for(int i=1;i<=5;i++)
            for(int j=1;j<=5;j++)
                if(mp[p[k].matrix[i][j]])
                    p[k].check[i][j]=true;
    for(int i=1;i<=n;i++){
        p[i].isOk=mycheck(p[i].check);
        if(p[i].isOk)cnt++;
    }
    std::cout<<cnt<<'\n';
    for(int i=1;i<=n;i++){
        if(p[i].isOk)std::cout<<p[i].name<<'\n';
    }
}