算法博弈论例题

喜羊羊和懒羊羊一起玩玻璃球游戏,已知玻璃球有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;}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小昔超厉害

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值