题解:P15068 [UOI 2024 II Stage] Tic-Tac-Toe
前言
下文的【思路】、【解法】、【注意事项】和【代码】均采用 C++17 的标准。
洛谷题目
解法
等价于判断如下问题:
- 如果一个位置原先已经放置了棋子,如果后来变了,一定不可能;
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;
}