算法博弈论例题
喜羊羊和懒羊羊一起玩玻璃球游戏,已知玻璃球有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;}

浙公网安备 33010602011771号