zoukankan      html  css  js  c++  java
  • strGame:博弈论,trie

    挺有意思的一道题。初探博弈论。

    最好自己思考?

    我们先考虑只有1轮游戏的情况。

    这题明显要在字符串上一位一位地走,所以对字符串建立起trie。

    最终建立起的trie的叶节点就是必败位置了。

    对于非叶节点,如果它有一个儿子是必败节点,那么这个节点就是必胜节点了。(类似与mex函数)

    那么如果根节点必胜,那么就是先手必胜,否则就是后手必胜了。

    如果最后一轮后手必胜,那么两个人就需要争夺最后一轮的后手,所以他们要赢倒数第二轮。

    而倒数第二轮和最后一轮是一样的,那么倒数第二轮也是后手必胜。倒数第二轮的后手整场游戏也必胜。

    以此类推到倒数第三轮,倒数第四轮。。。直到第一轮,都一样。

    所以,如果某一轮中后手必胜,那么整场游戏后手Dirty必胜。

    剩下的情况就是先手必胜,那么就是要争夺先手,那么就要尽量输掉倒数第二轮。

    如何判定先手能否必定让自己输掉一轮游戏?

    只要把trie树的叶节点改为必胜节点就好了,再跑一遍。

    那么如果先手可以必定让自己输掉一轮游戏,也能必定让自己赢一轮游戏。

    那么除了最后一轮以外他都可以让自己输掉以取得先手,直到最后一轮让自己取胜。

    所以,如果某一轮中先手必胜,先手在相反游戏中也必胜(即可以让自己必定输掉),那么整场游戏先手Pure必胜。

    剩下的就是先手在一轮游戏中必胜,但是不能在相反游戏中取胜(即自己不能必定输掉)。

    最后一轮是先手必胜。

    倒数第二轮中要争夺最后一轮的先手,故要输掉,所以倒数第二轮中的后手在整场游戏中必胜。

    倒数第三轮中要争夺倒数第二轮的后手,要赢,所以倒数第三轮的先手在整场游戏中必胜。

    以此类推。。。

    所以,如果一轮游戏先手必胜,而相反游戏后手必胜(即先手不能让自己输掉),总轮数为奇数时,先手Pure必胜。否则,后手Dirty必胜。

    好题。

    自己思考酣畅淋漓(数学自习灵感++)

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 int k,trie[100005][27],w[2][100005],cnt,n,rt,len;char s[100005];
     5 void insert(int &p,int al){
     6     if(!p)p=++cnt;if(al==len)return;
     7     insert(trie[p][s[al]-'a'],al+1);
     8 }
     9 void dfs(int p){
    10     int hs=0;w[0][p]=w[1][p]=0;
    11     for(int i=0;i<=25;++i)if(trie[p][i]){hs=1;break;}
    12     if(!hs){w[0][p]=1;w[1][p]=0;return;}
    13     for(int i=0;i<=25;++i)if(trie[p][i]){
    14         dfs(trie[p][i]);
    15         if(!w[0][trie[p][i]])w[0][p]=1;
    16         if(!w[1][trie[p][i]])w[1][p]=1;
    17     }
    18 }
    19 int main(){
    20     int t;scanf("%d",&t);
    21     while(t--){
    22         scanf("%d%d",&n,&k);rt=cnt=0;memset(trie,0,sizeof trie);
    23         for(int i=1;i<=n;++i)scanf("%s",s),len=strlen(s),insert(rt,0);
    24         dfs(rt);//for(int i=1;i<=cnt;++i)printf("%d %d
    ",w[0][i],w[1][i]);
    25         if(!w[1][rt])puts("Dirty");
    26         else if(w[0][rt])puts("Pure");
    27         else if(k&1)puts("Pure");
    28         else puts("Dirty");
    29     }
    30 }
    View Code
  • 相关阅读:
    JSP中的一个树型结构
    访问SAP的RFC
    MySQL InnoDB的一些参数说明
    Python: 去掉字符串中的非数字(或非字母)字符
    获取百度地图代码方法
    ps修图之——四步去修图后的毛边
    Python中给文件加锁
    问答项目---金币经验奖励规则及网站配置写入config文件
    问答项目---封装打印数组的方法
    问答项目---栏目增删改方法示例
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11564050.html
Copyright © 2011-2022 走看看