Good Luck in CET-4 Everybody!

----------------------

这就是一个博弈论

-------------------------

题目: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\n";
        else
        cout<<"Cici\n";
    }
    return 0;
} 
Ac

 

posted @ 2020-07-18 14:56  Simex  阅读(153)  评论(0编辑  收藏  举报