問題
問題文
$3 \times 3$ のサイズのビンゴカードがあります。上から $i$ 行目、左から $j$ 列目の数は $A_{i,j}$ です。
続けて、 $N$ 個の数 $b_1,b_2,\ldots,b_N$ が選ばれます。選ばれた数がビンゴカードの中にあった場合、ビンゴカードのその数に印を付けます。
$N$ 個の数字が選ばれた時点でビンゴが達成されているか、則ち、縦・横・斜めのいずれか $1$ 列に並んだ $3$ つの数の組であって、全てに印の付いているものが存在するかどうかを判定してください。
制約
・入力は全て整数
・$1 \le A_{i,j} \le 100$
・$A_{i_1,j_1} \ne A_{i_2,j_2}~((i_1,j_1) \ne (i_2,j_2))$
・$1 \le N \le 10$
・$1 \le b_i \le 100$
・$b_i \ne b_j~(i \ne j)$
収録されている問題セット
回答
回答1 (AC)
ビンゴカードがビンゴになっているかを調べる問題です。ビンゴカードの i 行目 j 列目のマス目の値を vector 型変数 a の a.at(i).at(j) に保持し、その値が選ばれていれば 1、選ばれていなければ 0 に置き換えた後、縦・横・斜めに 1 が並んでいるかを調べていけば良いでしょう。コードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<vector<int>> a(3,vector<int>(3));
for ( int i=0; i<3; i++ ) {
for ( int j=0; j<3; j++ ) {
cin >> a.at(i).at(j);
}
}
int n;
cin >> n;
vector<int> b(n);
for ( int i=0; i<n; i++ ) {
cin >> b.at(i);
}
vector<int> bingo(101,0);
for ( int i=0; i<n; i++ ) {
bingo.at(b.at(i)) = 1;
}
for ( int i=0; i<3; i++ ) {
for ( int j=0; j<3; j++ ) {
a.at(i).at(j) = bingo.at(a.at(i).at(j));
}
}
string answer = "No";
for ( int i=0; i<3; i++ ) {
if( a.at(i).at(0) && a.at(i).at(1) && a.at(i).at(2) ) {
answer = "Yes";
}
if( a.at(0).at(i) && a.at(1).at(i) && a.at(2).at(i) ) {
answer = "Yes";
}
}
if( a.at(0).at(0) && a.at(1).at(1) && a.at(2).at(2) ) {
answer = "Yes";
}
if( a.at(0).at(2) && a.at(1).at(1) && a.at(2).at(0)==1 ) {
answer = "Yes";
}
cout << answer << endl;
}
調べたこと
AtCoder の解説 → ユーザ解説
回答1と同じ方針でした。
AtCoder の解説 → コンテスト全体の解説
回答1と同じ方針でした。
リンク
前後の記事
- 前の記事 → AtCoderログ:0087 - ABC 091 B