B君的游戏

本文介绍了一个有趣的数字游戏:两位玩家轮流从一组初始数字中选择一个正整数x移除,并添加7个新数字x1到x7。游戏的核心在于如何选择x及确定新增的xi值,以获得最终胜利。

B君和L君要玩一个游戏。刚开始有n个正整数 ai 。

双方轮流操作。每次操作,选一个正整数x,将其移除,再添加7个数字 x1,x2…x7 。要求对于 xi ,满足 0<=xi

# AT_abc349_e [ABC349E] Weighted Tic-Tac-Toe ## 题目描述 有一个 $3 \times 3$ 的格子。第 $i$ 行第 $j$ 列的格子记作格子 $(i, j)$,其中 $1 \leq i, j \leq 3$。每个格子 $(i, j)$ 上写有一个整数 $A_{i, j}$。保证 $\sum_{i=1}^3 \sum_{j=1}^3 A_{i, j}$ 是奇数。所有格子初始时都是白色。 高桥和青木用这个格子进行游戏游戏中,高桥先手,两人轮流进行如下操作: - 选择一个当前为白色的格子 $(i, j)$(保证每次操作时一定存在这样的格子)。进行操作的玩家获得 $A_{i, j}$ 分数。然后,如果当前玩家是高桥,则将该格子涂为红色;如果是青木,则涂为蓝色。 每次操作后,进行如下判定: - 判断是否存在某一行、某一列或某一条对角线上有三个连续的格子被涂成相同的颜色。如果存在,则游戏立即结束。如果是三连红,则高桥获胜;如果是三连蓝,则青木获胜。 - 判断是否还存在白色格子。如果不存在,则游戏立即结束,此时累计得分较高的玩家获胜。 保证游戏一定会在有限步内结束,且最终必有一方获胜。两人都以获胜为目标并采取最优策略时,请判断最终谁会获胜。 ## 输入格式 输入为一行,包含 $A_{1,1}$ $A_{1,2}$ $A_{1,3}$ $A_{2,1}$ $A_{2,2}$ $A_{2,3}$ $A_{3,1}$ $A_{3,2}$ $A_{3,3}$。 ## 输出格式 如果高桥获胜,输出 `Takahashi`;如果青木获胜,输出 `Aoki`。 ## 输入输出样例 #1 ### 输入 #1 ``` 0 0 0 0 1 0 0 0 0 ``` ### 输出 #1 ``` Takahashi ``` ## 输入输出样例 #2 ### 输入 #2 ``` -1 1 0 -4 -2 -5 -4 -1 -5 ``` ### 输出 #2 ``` Aoki ``` ## 说明/提示 ### 限制条件 - $|A_{i, j}| \leq 10^9$ - $\sum_{i=1}^3 \sum_{j=1}^3 A_{i, j}$ 为奇数 - 输入均为整数 ### 样例解释 1 如果高桥第一步选择 $(2, 2)$,无论青木如何行动,高桥都可以通过合理操作避免出现三连蓝。如果出现三连红,则高桥获胜。如果没有出现三连红且游戏结束,此时高桥得 $1$ 分,青木得 $0$ 分,因此无论如何高桥都能获胜。 由 ChatGPT 4.1 翻译 为什么WA了 ```cpp #include <iostream> #include <algorithm> using namespace std; int a[3][3], b[3][3]; bool check() { for (int i = 0; i < 3; i++) { if (b[i][0] && b[i][0] == b[i][1] && b[i][0] == b[i][2]) return true; if (b[0][i] && b[0][i] == b[1][i] && b[0][i] == b[2][i]) return true; } if (b[0][0] && b[0][0] == b[1][1] && b[0][0] == b[2][2]) return true; if (b[0][2] && b[0][2] == b[1][1] && b[0][2] == b[2][0]) return true; return false; } bool dfs(int t, long long delta) { if (t > 9) return delta < 0; if (check()) return false; bool flag = false; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { if (b[i][j]) continue; b[i][j] = i % 2 ? 1 : 2; flag |= !dfs(t + 1, delta + (i % 2 ? 1 : -1) * a[i][j]); b[i][j] = 0; } return flag; } int main() { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) cin >> a[i][j]; cout << (dfs(1, 0) ? "Takahashi\n" : "Aoki\n"); return 0; } ```
最新发布
08-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值