[博弈论]剪纸游戏(有向图游戏的和)

https://www.acwing.com/problem/content/221/

题意:

思路:
最终状态的sg就等于所有后继状态的mex
每次分成的两张剪纸是算作是两个游戏,两个游戏的sg值异或起来

细节:
对x来说,一开始i的范围是 [1,x),因为要给后一张纸留长度
然后,为了让纸满足条件,不能中间不能让【1,?】或者【?,1】这样的纸生成
因为一旦生成这样的纸,则后手直接一剪,得到【1,1】,直接获胜
vis数组开到所有后继状态的最大数量

代码

const int N = 205;
int t,n,m;
int sg[N][N];
int dfs(int x,int y){
    if(x > y) swap(x,y);
    if(sg[x][y] != -1) return sg[x][y];
    if(x == 1 && y == 1) return sg[x][y] = 0;
    int vis[N];
    memset(vis,0,sizeof vis);
    for(int i=2;i<x-1;i++){
        vis[dfs(i,y) ^ dfs(x-i,y)] = 1;
    }
    for(int i=2;i<y-1;i++){
        vis[dfs(x,i) ^ dfs(x,y-i)] = 1;
    }

    for(int i=0;i<N;i++){
        if(!vis[i]) return sg[x][y] = i;
    }
}
int main(){
    memset(sg,-1,sizeof sg);
    while(~scanf("%d %d",&n,&m)){
        if(n > m) swap(n,m);
        if(dfs(n,m)) puts("WIN");
        else puts("LOSE");
    }
    return 0;
}
posted @   Isaac233  阅读(94)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示