题解:P15068 [UOI 2024 II Stage] Tic-Tac-Toe

· · 题解

前言

下文的【思路】、【解法】、【注意事项】和【代码】均采用 C++17 的标准。

洛谷题目

解法

等价于判断如下问题:

  1. 如果一个位置原先已经放置了棋子,如果后来变了,一定不可能;
  2. X 的个数要么与 0 的个数相等,要么比 0 的个数多一(因为 X 是先手,0 是后手)。

分别判断即可。

代码

char old[4][4], now[4][4];
int a[2];

signed main() {
    ios::sync_with_stdio(false), ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); clock_t timr_start = clock();

    up(i, 1, 3) up(j, 1, 3) read(old[i][j]);                  // 读入 old
    up(i, 1, 3) up(j, 1, 3) read(now[i][j]);                  // 读入 now

    up(i, 1, 3) up(j, 1, 3) {                                 // 枚举每一个格子
        if (old[i][j] != '.' && now[i][j] != old[i][j]) {     // 问题 1 的判定
            write("NO");
            return 0;
        }
        if (now[i][j] != '.') ++a[now[i][j] == '0'];          // 是 'X' 则 ++a[0] 是 '0' 则 ++a[1]
    }
    write((a[0] == a[1]) || (a[0] == a[1] + 1)? "YES": "NO"); // 问题 2 的判定

    cerr << "time use " << (clock() - timr_start) << "ms.";
    return 0;
}