----------------------
这就是一个博弈论
-------------------------
题目:Miku
----------------------------
这道题我们既可以找规律:如果N是三的倍数,C就赢了,并且我们也可以用SG函数
好,那么怎么用SG函数实现呢,首先确定边界。
如果当前人面前有0个石子,那么显然他输了对吧(最后一个一定被上个人拿走了)
那么SG[0]=0;(我用0表示当前人必败,1必胜0)
那么其他情况呢?人肯定是理智的(不然怎么考四级),那么对于某一个状态(当前人的石子数),无论他怎么取,
导向的状态(sg)都是下一个人必胜,那么他肯定必败了sg{当前}=0;
同理,只要有一种状态能够sg{下个人的石子数}=0,也就是让下一个人必败,那么他就赢了,对吧
然后这个过程用dfs来实现
Code Time
------------------------------------------
#include<iostream> #include<cstdio> using namespace std; int n; int j=1; int sg[1005]; int f[1005]; int mi[15]; bool check(int x){ if(f[x]) return sg[x]; f[x]=1; int ans=0; int i; for( i=0;mi[i]<=x;++i){ if(!f[x-mi[i]]){ check(x-mi[i]); f[x-mi[i]]=1; } ans+=sg[x-mi[i]]; } if(ans==i) return sg[x]=0; else return sg[x]=1; } int main(){ mi[0]=1; sg[0]=0; f[0]=1; for(int i=1;i<=10;++i){ j*=2; mi[i]=j; } while(cin>>n){ if(check(n)) cout<<"Kiki "; else cout<<"Cici "; } return 0; }