1. 问题描述:

给定一个有 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
来源:https://www.acwing.com/problem/content/1321/

2. 思路分析:

分析题目可以知道这是一道sg函数定义的模板题,当存在一个棋子的时候先手必胜等价于棋子所在的sg函数值不等于0,如果存在多个棋子,先手必胜等价于多个sg函数的异或值不等于0,sg函数值与nim游戏过程的推导是一样的,如何求解sg函数的值呢?可以使用记忆化搜索的方法求解出sg函数值,在递归遍历当前节点u的所有子节点的时候将所有子节点的sg函数值加入到set集合或者是哈希表中,从0开始遍历直到找到第一个不在set或者是哈希表中的值,说明当前的值就是sg函数的函数值。(sg函数值就等于第一个不在集合中的自然数的值,当当前节点的子节点只要有一个是必败的状态那么当前节点的sg函数就不等于0)

3. 代码如下:

from typing import Listclass Solution:# sg函数def sg(self, u: int, f: List[int], g: List[List[int]]):if f[u] != -1: return f[u]rec = dict()for next in g[u]:rec[self.sg(next, f, g)] = 1i = 0# 从前往后找第一个不在集合中的值while True:if i not in rec:f[u] = ibreaki += 1return f[u]def process(self):n, m, k = map(int, input().split())# 有向无环图g = [list() for i in range(n + 10)]for i in range(m):a, b = map(int, input().split())g[a].append(b)res = 0f = [-1] * (n + 10)a = list(map(int, input().split()))for i in range(k):res ^= self.sg(a[i], f, g)if res:print("win")else:print("lose")if __name__ == "__main__":Solution().process()

1319 移棋子游戏(sg函数模板)相关推荐

  1. [AcWing] 1319.移棋子游戏 博弈论 Sg函数板子题

    题目链接:1319.移棋子游戏 题解 好久没写博弈论的题了,写几道复习一下,博弈论SG主要由两大部分组成:SG函数和SG定理 SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S ...

  2. AcWing 1319. 移棋子游戏

    sg函数是一张有向无环图 尼姆博弈对每一张图sg(值)进行游戏 就是加强版的集合尼姆博弈(集合尼姆博弈中拓展是根据集合可能的新状态),这里是回归本质,sg操作是对每个状态拓展出边,并通过出边sg值集合 ...

  3. 1319. 移棋子游戏(sg+图论(移棋子)邻接表)

    题目:https://www.acwing.com/problem/content/1321/ 给定一个有 N 个节点的有向无环图,图中某些节点上有棋子,两名玩家交替移动棋子. 玩家每一步可将任意一颗 ...

  4. NIM数字游戏 SG函数 有向图博弈 学习记录

    写在前面:很早之前我就想写一写博弈论的学习记录了.本篇文章记录了我在学习博弈论初步时的顺序,现在网络上的博弈论资料大多都是从SG函数开始讲解,而我谜一样的学习方法让我对博弈论初步有了不同的理解过程,所 ...

  5. 组合博弈游戏 - SG函数和SG定理

    转载来自:http://blog.csdn.net/luomingjun12315/article/details/45555495 在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜 ...

  6. 组合游戏 - SG函数和SG定理

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正 ...

  7. 【博弈】SG函数模板 nyoj913取石子(十)

    SG函数模板 源于http://www.cnblogs.com/frog112111/p/3199780.html 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算, ...

  8. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 871  Solved: 365 [Submit][Status][Discuss] Descripti ...

  9. 数学基础(四)博弈论(巴什博弈~威佐夫博弈(黄金分割率)~尼姆博奕~斐波那契博弈~SG函数模板)

    一.巴什博弈 1.问题模型 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜. 2.解决思路: 当n=m+1时,由于一次最多只能取m个,所以无论先取者拿走多 ...

  10. HDU-1848--博弈SG函数模板题

    这篇文章写的很好,值得转发. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数. 例如mex{0,1,2,4}=3.mex{2,3 ...

最新文章

  1. css让image不改变大小_变压器怎样改变电压的?
  2. python dataframe取一列_python - 从pandas DataFrame列标题中获取列表
  3. [Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]
  4. 编译安装python3.6_编译安装Python3.6及以上
  5. Chrome谷歌插件开发-01
  6. C++官方文档-this
  7. Eclipse Tips(1):增强智能感知
  8. 生成、打包、部署和管理应用程序及类型(2):元数据概述
  9. 慕课网仿去哪儿项目笔记--(五)-详情页面的开发
  10. 【矩阵论笔记】Schmidt正交化、标准正交基
  11. 2018 PHP面试真题(包括详细解析)
  12. 15 个最佳开源设计工具
  13. 在 Word 中如何画底线、直线、虚线?
  14. 设计一个用户注册页面,对用户输入的内容进行有效性验证,如用户名和密码不能为空,两次输入的密码必须相同,邮箱地址必须包含“@”符号等。
  15. Oracle 企业管理器DataBase Control使用说明
  16. 获得淘宝商品详情原数据接口调用展示
  17. Linux_centos版初学(基础命令)
  18. 推荐几款不错的 Mac 文字处理器
  19. ACW 4194. Pow
  20. 详解tcp/ip连接建立与释放

热门文章

  1. 机房短信通(SMS Alert System)
  2. 存储区域网络(SAN)
  3. MSCD software disk for win vista龙帝国vista 软件光盘合集
  4. 北京内推 | 启元世界招聘虚拟人算法工程师/实习生
  5. 制作符合期刊审图号标准的中国地图(含九段线)
  6. 微信3D小游戏已达数百款,这里肯定有你没玩过的小游戏!
  7. AlphaBlend失败,错误码87
  8. HTML5+CSS3的速查手册
  9. java struts2教程_Struts2学习教程之入门小白的开始基础
  10. 《Adobe Photoshop CS5中文版经典教程(全彩版)》—第1课1.1节开始在Adobe Photoshop中工作...