【競プロ精進ログ】ABC157-B

zuka

ABCをコツコツ解いていきます。

本記事は,管理人の競技プロ精進日記としてログを取ったものです。モチベーションを爆上げするために,積極的にアウトプットしていく作戦です。

これから競技プログラミングを始めようと考えている人や,なんとなく敷居が高いと感じている人の参考になれば嬉しく思います。その他の記事は以下をご覧ください。

目次

本記事の概要

Atcoderで初心者用のコンテストとして開催されているAtcoder Beginner Contest(通称ABC)を解いていくものです。今回はABC157-B「Bingo」です。

ポイント

ビンゴが揃ったかどうかの条件が少し面倒臭い問題でした。愚直に「縦が揃った場合」「横が揃った場合」「斜めが揃った場合」に分けて実装していきましょう。ビンゴのマス目や,ビンゴで穴が開けられたかどうかはbool型の二次元配列で管理することができます。

おさえるべき内容

 二次元配列の利用

実装

#include <bits/stdc++.h>
#define _GLIBCXX_DEBUG
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
using namespace std;

// グローバルに宣言してしまう
// 少し余裕を持たせて5×5で作る
int A[5][5];
bool C[5][5];
// Bは大きくても10なので余裕をもたせて20
int B[20];

int main(){
  rep(i, 3){
    rep(j, 3){
      cin >> A[i][j];
    }
  }
  int N;
  cin >> N;
  rep(i, N) cin >> B[i];

  // ビンゴの穴が空いているかどうかを判断してboolを挿入
  // 初期値は0,つまりfalseになっているので穴が開かなければそのままでOK
  rep(i, 3){
    rep(j, 3){
      rep(k, N){
        if (A[i][j]==B[k]) C[i][j] = true;
      }
    }
  }

  // こっからソルバー
  bool bingo = false;
  // もし縦が揃えばbingoをtrueに
  rep(i, 3){
    if (C[i][0] && C[i][1] && C[i][2]) bingo = true;
  }
  // もし横が揃えばbingoをtrueに
  rep(i, 3){
    if (C[0][i] && C[1][i] && C[2][i]) bingo = true;
  }
  // もしななめが揃えばbingoをtrueに
  if (C[0][0] && C[1][1] && C[2][2]) bingo = true;
  if (C[0][2] && C[1][1] && C[2][0]) bingo = true;

  // bingoがtrueであればビンゴ!
  if (bingo) cout << "Yes" << endl;
  else cout << "No" << endl;
}
よかったらシェアしてね!

コメント

コメントする

目次
閉じる