标签:target break bool php blank c++ int put art
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516
1. 先手不能在第一次把所有的石子取完;
2. 之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。
约定取走最后一个石子的人为赢家,求必败态。
我们简单举几个栗子:
当n=2时,后手必赢;
当n=3时,后手必赢;
当n=4时,只要先手取1个,剩下3个,无论后手取多少个,先手必赢;
当n=5时,①若先手先取1个,剩下4个,此时后手掌握n=4这种局面,则后手必赢;②若先手取2个,根据规则,后手可以一次性取完剩下的3个,则后手必赢;所以先手无论怎么取,此时后手必赢。
当n=6时,先手只要取1个,先手就掌握了n=5这种局面,即先手必赢;
当n=7时,先手只要取2个,先手就掌握了n=5这种局面,即先手必赢;
当n=8时,①若先手取1个时,后手就掌握了n=7这种局面,即后手必赢;②若先手取2个时,后手就掌握了n=6这种局面,即后手必赢;③若先手取3个,根据规则,后手可以一次性取走剩下的5个,剩下的情况都是后手必赢;所以无论先手怎么取,此时后手必赢。
......
继续推导下去,我们可以发现,只要n满足斐波那契数列2,3,5,8,13......,则后手必赢,否则先手必赢。相关证明看这:斐波那契博弈
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,fib[44]={2,3};bool flag; 6 for(int i=2;i<44;++i)//只需枚举44个fib数即可 7 fib[i]=fib[i-1]+fib[i-2]; 8 while(cin>>n && n){ 9 flag=false; 10 for(int i=0;i<44;++i) 11 if(fib[i]==n){flag=true;break;} 12 if(flag)cout<<"Second win"<<endl;//如果满足斐波那契数列,则后手必赢 13 else cout<<"First win"<<endl;//否则先手必赢 14 } 15 return 0; 16 }
标签:target break bool php blank c++ int put art
原文地址:https://www.cnblogs.com/acgoto/p/9095084.html