牛牛取石子(对称策略/模拟棋)
题目描述:
牛牛和牛妹在玩游戏,他们的游戏规则是这样的:
一共有两堆石子,第一堆有
- 第一堆取
个,第二堆取 个 - 第一堆取
个,第二堆取 个
谁先无法取石子,谁就输了。假设牛牛和牛妹都很聪明,请问谁会获胜?
输入描述:
第一行输入一个正整数
接下来
输出描述:
对于每组数据,输出一行,代表胜利者的名字(牛牛获胜输出niuniu,牛妹获胜输出niumei)。
样例:
input:
2
1 2
3 3
output:
niuniu
niumei
AC代码:
#include <bits/stdc++.h> using namespace std; typedef long long LL; int T = 1; void solve() { LL a, b; scanf("%lld%lld", &a, &b); int r = min(a, b) % 3; // 如果小的那一堆石子除以3的余数不是0,那么先手只要拿一个或者两个则必定让那堆石子的数量是3的倍数 // 那么后手不管怎么取,先手只要选择相反的操作那么两堆石子数量都是减3 // 所以后手必定会先遇到石子被取光的情况 if(r % 3) { // 但是有特殊情况,如果余数是1且两堆石子数量相同 // 一堆石子取1,则另一堆石子的数量就会更少且除以3的余数为2 // 这时候根据上面的结论,后手必胜 if(r % 3 == 1 && a == b) cout << "niumei" << '\n'; else cout << "niuniu" << '\n'; } // 如果小的那一堆石子除以3的余数是0,那么只要后手选择与先手相反的操作每次两堆石子数量都是减3 // 所以先手肯定先会遇到石子数量为0的情况(不论两堆石子一开始的数量是否相等) else { cout << "niumei" << '\n'; } } int main() { scanf("%d", &T); while(T --) solve(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理