算法博弈论例题

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

posted @   昔痕  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示