Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢。Cavin和David都非常想赢得这个游戏,如果Cavin可以先取,Cavin的必胜策略下第一步应该取
A、1个
B、3个
C、6个
D、Cavin没有必胜策略
#include "iostream"
#include "vector"
#include "string.h"
using namespace std;
int a[100];
int x, k;
bool win[10000];
int get[10000];
int main()
{
cout << "输入纽扣总数:";
cin >> x;
cout << "输入可取纽扣数的数组大小:";
cin >> k;
cout << "输入可取纽扣数的数组:" << endl;
int i, j;
for(i=0; i<k; i++)
cin >> a[i];
win[0] = false; //面对剩下0个纽扣的局面,输
for(i=1; i<=x; i++)
{
win[i] = false;
for(j=0; j<k; j++)
{
win[i] |= (a[j]<=i && !win[i-a[j]]); //使对手面对输的局面,自己赢
if(win[i])
{
get[i] = a[j];
break;
}
}
}
if(win[x])
{
cout << "Calvin获胜" << endl;
cout << "制胜的第一步所取纽扣的个数为:" << get[x] << endl;
}
else
cout << "David获胜" << endl;
return 0;
}
具体步骤:
C–3,D–6, C–3,D–3,C–1
C–3,D–6, C–3,D–1,C–3
C–3,D–3, C–1,D–6,C–3
C–3,D–3, C–1,D–3,C–6
C–3,D–3, C–1,D–1,C–6,D–1,C–1
C–3,D–1, C–1,D–6,C–3,D–1,C–1
C–3,D–1, C–1,D–3,C–6,D–1,C–1
C–3,D–1, C–1,D–1,C–1,D–6,C–3
C–3,D–1, C–1,D–1,C–1,D–3,C–6
C–3,D–1, C–1,D–1,C–1,D–1,C–6,D–1,C–1