题解/算法 {1319. 移棋子游戏}

该文章介绍了一个基于有向无环图(DAG)的棋子游戏,每个节点代表一个子游戏,每个子游戏有自己的SG值。当棋子位于叶节点时,游戏结束,SG值为0。通过MEX操作计算非叶节点的SG值,遍历所有子节点的SG值并找到未出现的最小正整数作为当前节点的SG值。
摘要由CSDN通过智能技术生成

题解/算法 {1319. 移棋子游戏}

LINK: https://www.acwing.com/problem/content/description/1321/;

G G G为DAG图;
G G a GG_a GGa表示一个公平的子游戏 G G G a a a点上有一个棋子;
可知, 当前游戏 为 G G GG GG组合游戏 比如在a,b,c,d上有一个棋子, 即当前游戏可以表示为{ GGa, GGb, GGc, GGd} (每次选择一个子游戏 操作他的棋子, 该操作并不会影响其他子游戏的状态, 因此这是组合游戏);

子游戏的SG值:
. 终止态: 当棋子在叶子节点 (即无儿子);

int Get_SG( int _a){ // `a >= 0`;
    static int __record[ 102];
    { static bool __is_first = true; if( __is_first){ __is_first = false; memset( __record, -1, sizeof( __record));}}
    auto & ANS = __record[ _a];
    if( ANS != -1){ return ANS;}
    //--

    { // 检查终止态;
        bool is_leaf = false;
        if( G->Head[ _a] == -1){
            is_leaf = true;
        }
        if( is_leaf){ return ANS = 0;}
    }

    unordered_set< int> mex;
    for( int edge = G->Head[ _a]; ~edge; edge = G->Next[ edge]){
        mex.insert( Get_SG( G->Vertex[ edge]));
    }
    //> 对`mex`进行MEX操作;
    for( ANS = 0; ; ++ANS){
        if( mex.find( ANS) == mex.end()){
            break;
        }
    }
    return ANS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值