算法博弈论例题
喜羊羊和懒羊羊一起玩玻璃球游戏,已知玻璃球有n个,两人轮流取走1到m个玻璃球(1,2,3,…,m中的任意整数),最先取走玻璃球的一方为胜利者。
如果双方都使用最优策略,请输出哪方会赢。
Input
每组测试数据占一行,包含两个整数n和m(1<=n,m<=1000),n和m的含义见题目描述。
Output
如果先走的人能赢,请输出“first”,否则请输出“second”。
Sample Input
23 2
Sample Output
first
我的题解C/C++
#include <iostream>
#include <cstdio>
using namespace std;
#define MAXN 12000
int a[120];
int win[MAXN]; //win表示的是先手的必胜必败态
int main(){
int n,m;
int i,j;
cin>>n>>m;
for(i=1;i<=m;i++)
{
a[i]=1;
}
win[0]=0; //0个硬币 先手肯定没硬币拿啊,
//这也给我们启示,首先要考虑没有硬币的情况。
for(j=1;j<=n;j++)
{
win[j]=0;
for(i=1;i<=m;i++)
{
win[j]=(a[i]<=j&&win[j-a[i]]==0);//原理:j-a[i]是必败态的话,j就是必胜态,逆向递推
if(win[j]) break;
} //j-a[i]是必胜态的话,j就是必败态
} // a[i]<=j说明还有硬币可以拿,
// j-a[i]是必败态
if(win[n]) cout<<"first"; // 与的话a如果>j的话,就直接结束了。
else cout<<"second";
return 0;}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)