https://atcoder.jp/contests/abc157/tasks/abc157_b
解説
https://atcoder.jp/contests/abc157/submissions/10470979
実装問題。
まずは、punched[y][x] := (x,y)に印がついているか
をN個の選ばれた数を見ながら作成しよう。
あとは、これがビンゴになっているかの確認である。
縦、横については、印がついている個数を行ごと、列ごとに考えて、3つあればビンゴとする。
ななめは直書きしたが、ループでもそんなにたいしたことない。
(なんなら、横も縦も直で書けばよかったかも)
int A[3][3], N; bool punched[3][3]; //--------------------------------------------------------------------------------------------------- void _main() { rep(y, 0, 3) rep(x, 0, 3) cin >> A[y][x]; cin >> N; rep(i, 0, N) { int b; cin >> b; rep(y, 0, 3) rep(x, 0, 3) if (A[y][x] == b) punched[y][x] = true; } bool ans = false; // 横 rep(y, 0, 3) { int cnt = 0; rep(x, 0, 3) if (punched[y][x]) cnt++; if (cnt == 3) ans = true; } // 縦 rep(x, 0, 3) { int cnt = 0; rep(y, 0, 3) if (punched[y][x]) cnt++; if (cnt == 3) ans = true; } // ななめ if (punched[0][0] && punched[1][1] && punched[2][2]) ans = true; if (punched[2][0] && punched[1][1] && punched[0][2]) ans = true; if (ans) cout << "Yes" << endl; else cout << "No" << endl; }