ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[ACW]893集合-Nim游戏

2020-01-27 13:57:21  阅读:339  来源: 互联网

标签:局面 ... 有向图 游戏 Nim int 893 ACW SG


题链

tips:

  1.对于简单的Nim游戏,a1^...an;ai就是sg函数值。

  2.一堆石子就是一个有向图;可以按条件转移局面。

  3.sg函数的定义有递归的味道,所以用记忆化搜索来写。

  5.sg(x)=k,则局面x可以转移到0~k-1。

  4.puts输出字符串会自动换行

//sg函数的定义本身就有递归的感觉,一直到递归基
#include<bits/stdc++.h>
#include<iostream>
#include<set>
using namespace std;

int n,m;
const int N=110,M=10010;
int s[N],F[M];

int sg(int x){
    if(F[x]!=-1) return F[x];
    //用哈希表存所有可以到的局面
    unordered_set<int > S;
    for(int i=0; i<n; i++){
        if(x >= s[i]) S.insert(sg(x-s[i]));
    }
    for(int i=0;;i++){
        if(!S.count(i)) return F[x]=i;
    }

}
int main(){
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>s[i];
    }


    cin>>m;
    memset(F , -1, sizeof(F));
    int res=0;
    for(int i=0; i<m; i++){
        int x;
        cin>>x;
        res^=sg(x);
    }
    if(res) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;

    return 0;
}
View Code
NIM游戏
    给定N堆物品,第i堆物品有Ai个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜。
    
    我们把这种游戏称为NIM博弈。把游戏过程中面临的状态称为局面。整局游戏第一个行动的称为先手,第二个行动的称为后手。若在某一局面下无论采取何种行动,都会输掉游戏,则称该局面必败。
    所谓采取最优策略是指,若在某一局面下存在某种行动,使得行动后对面面临必败局面,则优先采取该行动。同时,这样的局面被称为必胜。我们讨论的博弈问题一般都只考虑理想情况,即两人均无失误,都采取最优策略行动时游戏的结果。
    NIM博弈不存在平局,只有先手必胜和先手必败两种情况。
    
    定理: NIM博弈先手必胜,当且仅当 A1 ^ A2 ^ ... ^ An != 0


公平组合游戏ICG
    若一个游戏满足:
    1. 由两名玩家交替行动;
    2. 在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;
    3. 不能行动的玩家判负;
    则称该游戏为一个公平组合游戏。
    NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。因为围棋交战双方分别只能落黑子和白子,胜负判定也比较复杂,不满足条件2和条件3。


有向图游戏
    给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。
    任何一个公平组合游戏都可以转化为有向图游戏。具体方法是,把每个局面看成图中的一个节点,并且从每个局面向沿着合法行动能够到达的下一个局面连有向边。


Mex运算
    设S表示一个非负整数集合。定义mex(S)为求出不属于集合S的最小非负整数的运算,即:
        mex(S) = min{x}, x属于自然数,且x不属于S


SG函数
    在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达节点y1, y2, ..., yk,定义SG(x)为x的后继节点y1, y2, ..., yk 的SG函数值构成的集合再执行mex(S)运算的结果,即:
        SG(x) = mex({SG(y1), SG(y2), ..., SG(yk)})
    特别地,整个有向图游戏G的SG函数值被定义为有向图游戏起点s的SG函数值,即SG(G) = SG(s)。


有向图游戏的和
    设G1, G2, ..., Gm 是m个有向图游戏。定义有向图游戏G,它的行动规则是任选某个有向图游戏Gi,并在Gi上行动一步。G被称为有向图游戏G1, G2, ..., Gm的和。
    有向图游戏的和的SG函数值等于它包含的各个子游戏SG函数值的异或和,即:
        SG(G) = SG(G1) ^ SG(G2) ^ ... ^ SG(Gm)


定理
    有向图游戏的某个局面必胜,当且仅当该局面对应节点的SG函数值大于0。
    有向图游戏的某个局面必败,当且仅当该局面对应节点的SG函数值等于0。
概念讲解

sum:

  1.在c++官网上查语法。

标签:局面,...,有向图,游戏,Nim,int,893,ACW,SG
来源: https://www.cnblogs.com/SUMaywlx/p/12235821.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有