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

· · 题解

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

思路

比较棋盘 AB

  1. 只能走一步(X 先手,所以下一步是 O)。
  2. 合法操作:在空位放一个 O
  3. 检查 B 是否比 A 多一个 O,且其他格子相同。

算法

  1. 统计 ABX0 的数量
  2. 检查差异:
    • 如果 BA 多一个 O,且 X 数量相同 可能。
    • 否则 不可能。
  3. 还要检查 B 中每个格子是否合法:
    • 不能把 A 中的棋子改成别的。
    • 只能把 . 改成 O

代码

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

int main(){
    string a[3], b[3];
    for(int i=0;i<3;i++) cin>>a[i];
    for(int i=0;i<3;i++) cin>>b[i];

    int ax=0, ao=0, bx=0, bo=0;
    bool ok=true;

    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(a[i][j]=='X') ax++;
            if(a[i][j]=='0') ao++;
            if(b[i][j]=='X') bx++;
            if(b[i][j]=='0') bo++;

            // 检查格子变化是否合法
            if(a[i][j]!='.' && b[i][j]!=a[i][j]) ok=false;
        }
    }

    if(ok && bx==ax && bo==ao+1) cout<<"YES";
    else cout<<"NO";

    return 0;
}