頭良くなりたい人

文系大学生shadeのブログです。競技プログラミングや人文学の話題,受験ネタなど。

ABC157 B - Bingo

問題はこちら
atcoder.jp

指針

例によってスマートな解き方が分かりません。

数字表と判定表の2つのビンゴシートを作って穴が開く場所を先に調べ,後からビンゴの成立を調べています。

本問は 3\times3 のビンゴなので何でもないですが,N\times N だったりした場合にはビンゴの成立判定を工夫する必要がありそうですね。

コード

#include <bits/stdc++.h>
using namespace std;
 
int main(){
    vector<vector<int>> a(3,vector<int>(3));
    vector<vector<bool>> a_m(3,vector<bool>(3));    
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            cin>>a.at(i).at(j);
            a_m.at(i).at(j)=false;
        }
    }
 
    int n;
    cin>>n;
 
    vector<int> b(n);
    for(int i=0; i<n; i++){
        cin>>b.at(i);
    }
 
    bool bingo=false;
 
    // ビンゴカードに印をつける
    for(int i=0; i<3; i++){
        for(int j=0; j<3; j++){
            for(int l=0; l<n; l++){
                if(a.at(i).at(j)==b.at(l)){
                    a_m.at(i).at(j)=true;
                }
            }
        }
    }
 
    // 縦のビンゴを判定
    for(int i=0; i<3; i++){
        if(a_m.at(i).at(0)==true && a_m.at(i).at(1)==true && a_m.at(i).at(2)==true){
            bingo=true;
        }
    }
 
    // 横のビンゴを判定
    for(int i=0; i<3; i++){
        if(a_m.at(0).at(i)==true && a_m.at(1).at(i)==true && a_m.at(2).at(i)==true){
            bingo=true;
        }
    }
 
    // 斜めのビンゴを判定
    if((a_m.at(0).at(0)==true && a_m.at(1).at(1)==true && a_m.at(2).at(2)==true) || (a_m.at(2).at(0)==true && a_m.at(1).at(1)==true && a_m.at(0).at(2)==true)){
        bingo=true;
    }
 
    if(bingo==true){
        cout<<"Yes"<<endl;
    }else{
        cout<<"No"<<endl;
    }
}