けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 261 B - Tournament Result (6Q, 灰色, 200 点)

二次元配列を調べる練習問題!

問題概要

 N 人のリーグ戦の戦績表が下図のように与えられる。'W' は勝ち、'L' は負け、'D' は引き分けを表す。また、対角線上は '-' である。

4
-WWW
L-DD
LD-W
LDW-

この戦績表が矛盾しているかどうかを調べよ。

考えたこと

 i, j に対して、マス  (i, j) とマス  (j, i) の整合性を確かめていけばよい。

  • 一方が 'D' のときは、他方も 'D' でなければならない
  • 一方が 'W' のときは、他方は 'L' でなければならない
  • 一方が 'L' のときは、他方は 'W' でなければならない

二重の for 文で実現できる。

コード

 i \lt j である範囲のみを調べれば十分なので、そのように実装した。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<string> A(N);
    for (int i = 0; i < N; ++i) cin >> A[i];
    
    bool ok = true;
    for (int i = 0; i < N; ++i) {
        for (int j = i + 1; j < N; ++j) {
            if (A[i][j] == 'D' && A[j][i] != 'D') ok = false;
            if (A[i][j] == 'W' && A[j][i] != 'L') ok = false;
            if (A[i][j] == 'L' && A[j][i] != 'W') ok = false;
        }
    }
    if (ok) cout << "correct" << endl;
    else cout << "incorrect" << endl;
}