首页 > 其他分享 >博弈论:移棋子游戏

博弈论:移棋子游戏

时间:2023-08-08 12:35:42浏览次数:57  
标签:游戏 int sg 博弈论 棋子 res include SG

给定一个有 N 个节点的有向无环图,图中某些节点上有棋子,两名玩家交替移动棋子。

玩家每一步可将任意一颗棋子沿一条有向边移动到另一个点,无法移动者输掉游戏。

对于给定的图和棋子初始位置,双方都会采取最优的行动,询问先手必胜还是先手必败。

输入格式

第一行,三个整数N,M,K,N 表示图中节点总数,M 表示图中边的条数,K 表示棋子的个数。

接下来 M 行,每行两个整数 X,Y 表示有一条边从点 X 出发指向点 Y。

接下来一行, K 个空格间隔的整数,表示初始时,棋子所在的节点编号。

节点编号从 1 到 N。

输出格式

若先手胜,输出 win,否则输出 lose。

数据范围

1≤N≤2000,
1≤M≤6000,
1≤K≤N

输入样例:

6 8 4
2 1
2 4
1 4
1 5
4 5
1 3
3 5
3 6
1 2 4 6

输出样例:

win
# 题解
## 思路: 求出所有棋子的 sg 函数值的异或值,若为0,则先手必败,否则先手必胜

 

 

 

 # 代码

```

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <set>

using namespace std;

const int N = 2005;
const int M = 6005;

int n, m, k;
int h[N], e[M], ne[M], idx; // 邻接表存图
int sg[N]; // 存所有被计算过的点的 SG 函数值
int res;

inline void add(int u, int v) // 加边函数。从点 u 向点 v 连一条有向边
{
e[ ++ idx] = v;
ne[idx] = h[u];
h[u] = idx;
}

int SG(int u)
{
if (~sg[u]) return sg[u]; // 如果当前 sg[u] 不是 -1,那么说明该点的 SG 函数值已经被计算过了,直接返回
set<int> S; // 否则要建一个集合 S,存该点能到的所有点的 SG 函数值
for (int i = h[u]; i; i = ne[i]) // 遍历点 u 能到达的所有点
S.insert(SG(e[i])); // 计算该点的 SG 函数值,并放入集合 S
for (int i = 0; ; i ++ ) // 从 0 开始枚举所有非负整数
if (!S.count(i)) // 如果该值没有在 S 中出现过
{
sg[u] = i; // 那么将该值记录在 sg[u] 中并返回
return i;
}
}

int main()
{
scanf("%d %d %d", &n, &m, &k); // 读入题目中 N, M, K
for (int i = 0; i < m; i ++ ) // 读入 M 条边并建图
{
int u, v;
scanf("%d %d", &u, &v);
add(u, v);
}
memset(sg, -1, sizeof sg); // 先将 sg 数组中的所有值初始化成 -1,表示没有记录过
while (k -- ) // 读入 K 个棋子所在的点
{
int u;
scanf("%d", &u);
res ^= SG(u);
}
if (res) puts("win"); // 如果 res 不为 0,那么输出 win
else puts("lose"); // 否则输出 lose
return 0;
}

```

标签:游戏,int,sg,博弈论,棋子,res,include,SG
From: https://www.cnblogs.com/liyuzhong/p/17613854.html

相关文章

  • 博弈论:台阶-Nim游戏
    现在,有一个 nn 级台阶的楼梯,每级台阶上都有若干个石子,其中第i 级台阶上有 ai 个石子(i≥1)。两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。问如果两人都采用最优策略,......
  • 谈谈游戏中如何防外挂和防破解
    前言这篇文章写于2018年一直在草稿箱,当时在某厂做手游,现在回过头来看,这些方法依然有用。对于一些外挂软件,现在我们借力AI,针对性上报玩家的行为序列log,通过AI分析是否外挂,然后把数据交由运营处理。在我开发一款大型mmoarpg过程中和服务器主程讨论游戏中防外挂、防破解的实现和......
  • Nim游戏
    给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。输入格式第一行包含整数n。第二行包含n个数字,其中第i个数字表示第i堆石子的数量。输出格式......
  • 知识图:人工智能和数据科学的游戏规则改变者
    知识图谱已成为人工智能和数据科学中一种强大而通用的方法,用于记录结构化信息,以促进成功的数据检索、推理和推理。本文探讨了最先进的知识图谱,包括构造、表示、查询、嵌入、推理、对齐和融合。我们还讨论了知识图谱的许多应用,例如推荐引擎和问答系统。最后,为了为新的进展和研究机......
  • 知识图:人工智能和数据科学的游戏规则改变者
    [知识图谱]已成为人工智能和数据科学中一种强大而通用的方法,用于记录结构化信息,以促进成功的数据检索、推理和推理。本文探讨了最先进的知识图谱,包括构造、表示、查询、嵌入、推理、对齐和融合。我们还讨论了知识图谱的许多应用,例如推荐引擎和问答系统。最后,为了为新的进展和研究......
  • 知识图:人工智能和数据科学的游戏规则改变者
    [知识图谱]已成为人工智能和数据科学中一种强大而通用的方法,用于记录结构化信息,以促进成功的数据检索、推理和推理。本文探讨了最先进的知识图谱,包括构造、表示、查询、嵌入、推理、对齐和融合。我们还讨论了知识图谱的许多应用,例如推荐引擎和问答系统。最后,为了为新的进展和研究......
  • 知识图:人工智能和数据科学的游戏规则改变者
    [知识图谱]已成为人工智能和数据科学中一种强大而通用的方法,用于记录结构化信息,以促进成功的数据检索、推理和推理。本文探讨了最先进的知识图谱,包括构造、表示、查询、嵌入、推理、对齐和融合。我们还讨论了知识图谱的许多应用,例如推荐引擎和问答系统。最后,为了为新的进展和研究......
  • 取数游戏 Atcoder-abc128_d
    枚举两端取了几个数,将手中的负数从小到大放回序列即可#include<bits/stdc++.h>usingnamespacestd;intn,m,a[55],c[55],ans=-0x7fffffff;intmain(){scanf("%d%d",&n,&m);for(inti=1;i<=n;i++)scanf("%d",&a[i]);f......
  • P1005 [NOIP2007 提高组] 矩阵取数游戏题解
    题面传送门:P1005[NOIP2007提高组]矩阵取数游戏-洛谷|计算机科学教育新生态(luogu.com.cn)分析题目可知,这道题是一道求最值的问题,第一次看题没有认真读题,以为是每次只在某一行中选一个数,于是想了半天无果。重新读题才发现每次需要每行都取,那么这就很简单了,相当于在每一行......
  • 代理IP与Socks5代理:跨界电商、游戏与爬虫的技术赋能
    一、代理IP与Socks5代理:简介与区别代理IP:代理IP是一种通过代理服务器转发网络请求的技术。它可以隐藏用户的真实IP地址,提供匿名访问,是实现地理突破的关键工具。Socks5代理:Socks5代理采用SOCKS5协议,相对于传统代理IP技术,支持TCP和UDP协议,提供更高性能、更强安全性和更全面的功能。......