取物输赢问题
100个物品,两个玩家a,b轮流从这堆物品中取物,规定每次可以取的数目可以是1,3,4,6。最后一次取光者得胜。问为了获胜应该先取还是后取,应采取什么策略。
思路分析
采用表格填数法逐步分析:
物品个数 iii | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
先取输赢 f(i)f(i)f(i) | 1 | 0 | 1 | 1 | 1 | 1 |
表中0表示先取为输,1表示先取为赢
如果想让先取为赢的话,玩家在还剩 iii 个物品时选择一个数目x(x=1,3,4,6)x(x = 1,3,4,6)x(x=1,3,4,6),使得对方处于f(i−x)=0f(i-x)=0f(i−x)=0的状态。
AC代码
#include<iostream>
using namespace std;
const int MAXSIZE = 10000;
int f[MAXSIZE];
int main(){
ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
int n;
cin >> n;
f[0] = f[2] = 0;
f[1] = f[3] = f[4] = f[5] = f[6] = 1;
for(int i = 7; i <= n; i++)
f[i] = !(f[i-1] && f[i-3] && f[i-4] && f[i-6]);
if(f[n]) cout << "先取者赢!" << endl;
else cout << "先取者输!" << endl;
return 0;
}