1319 移棋子游戏(sg函数模板)
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函数模板)相关推荐
- [AcWing] 1319.移棋子游戏 博弈论 Sg函数板子题
题目链接:1319.移棋子游戏 题解 好久没写博弈论的题了,写几道复习一下,博弈论SG主要由两大部分组成:SG函数和SG定理 SG(x)=mex(S),其中S是x的后继状态的SG函数值集合,mex(S ...
- AcWing 1319. 移棋子游戏
sg函数是一张有向无环图 尼姆博弈对每一张图sg(值)进行游戏 就是加强版的集合尼姆博弈(集合尼姆博弈中拓展是根据集合可能的新状态),这里是回归本质,sg操作是对每个状态拓展出边,并通过出边sg值集合 ...
- 1319. 移棋子游戏(sg+图论(移棋子)邻接表)
题目:https://www.acwing.com/problem/content/1321/ 给定一个有 N 个节点的有向无环图,图中某些节点上有棋子,两名玩家交替移动棋子. 玩家每一步可将任意一颗 ...
- NIM数字游戏 SG函数 有向图博弈 学习记录
写在前面:很早之前我就想写一写博弈论的学习记录了.本篇文章记录了我在学习博弈论初步时的顺序,现在网络上的博弈论资料大多都是从SG函数开始讲解,而我谜一样的学习方法让我对博弈论初步有了不同的理解过程,所 ...
- 组合博弈游戏 - SG函数和SG定理
转载来自:http://blog.csdn.net/luomingjun12315/article/details/45555495 在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜 ...
- 组合游戏 - SG函数和SG定理
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点,处于此情况下,双方操作均正 ...
- 【博弈】SG函数模板 nyoj913取石子(十)
SG函数模板 源于http://www.cnblogs.com/frog112111/p/3199780.html 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算, ...
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
Time Limit: 5 Sec Memory Limit: 162 MB Submit: 871 Solved: 365 [Submit][Status][Discuss] Descripti ...
- 数学基础(四)博弈论(巴什博弈~威佐夫博弈(黄金分割率)~尼姆博奕~斐波那契博弈~SG函数模板)
一.巴什博弈 1.问题模型 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个,最后取光者得胜. 2.解决思路: 当n=m+1时,由于一次最多只能取m个,所以无论先取者拿走多 ...
- HDU-1848--博弈SG函数模板题
这篇文章写的很好,值得转发. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数. 例如mex{0,1,2,4}=3.mex{2,3 ...
最新文章
- css让image不改变大小_变压器怎样改变电压的?
- python dataframe取一列_python - 从pandas DataFrame列标题中获取列表
- [Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]
- 编译安装python3.6_编译安装Python3.6及以上
- Chrome谷歌插件开发-01
- C++官方文档-this
- Eclipse Tips(1):增强智能感知
- 生成、打包、部署和管理应用程序及类型(2):元数据概述
- 慕课网仿去哪儿项目笔记--(五)-详情页面的开发
- 【矩阵论笔记】Schmidt正交化、标准正交基
- 2018 PHP面试真题(包括详细解析)
- 15 个最佳开源设计工具
- 在 Word 中如何画底线、直线、虚线?
- 设计一个用户注册页面,对用户输入的内容进行有效性验证,如用户名和密码不能为空,两次输入的密码必须相同,邮箱地址必须包含“@”符号等。
- Oracle 企业管理器DataBase Control使用说明
- 获得淘宝商品详情原数据接口调用展示
- Linux_centos版初学(基础命令)
- 推荐几款不错的 Mac 文字处理器
- ACW 4194. Pow
- 详解tcp/ip连接建立与释放
热门文章
- 机房短信通(SMS Alert System)
- 存储区域网络(SAN)
- MSCD software disk for win vista龙帝国vista 软件光盘合集
- 北京内推 | 启元世界招聘虚拟人算法工程师/实习生
- 制作符合期刊审图号标准的中国地图(含九段线)
- 微信3D小游戏已达数百款,这里肯定有你没玩过的小游戏!
- AlphaBlend失败,错误码87
- HTML5+CSS3的速查手册
- java struts2教程_Struts2学习教程之入门小白的开始基础
- 《Adobe Photoshop CS5中文版经典教程(全彩版)》—第1课1.1节开始在Adobe Photoshop中工作...