IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 博弈论——公平组合游戏ICG -> 正文阅读

[数据结构与算法]博弈论——公平组合游戏ICG

参考自算法进阶指南

公平组合游戏与有向无环图

一个博弈游戏被称为公平组合游戏(ICG)当且仅当其同时满足3个条件

  1. 由两名玩家交替行动
  2. 游戏任意时刻可进行的操作与轮到哪名玩家无关
  3. 不能进行操作的玩家判负

任何一个公平组合游戏都可以用一个有向无环图游戏模型表示
这个有向无环图有唯一的起点,表示游戏初始局面
图中每个结点表示一个局面,有向边表示能从一个局面到达另一个局面
想象初始时起点有一颗棋子,两名玩家轮流沿有向边将棋子移动一步,若某名玩家操作时棋子所在结点已无出边则判负
即分别代表了ICG中玩家交替行动和不能进行操作的玩家判负

SG函数

在有向无环图游戏模型中,对于每个节点 x x x,设其后继节点为 y 1 , y 2 , . . . , y k y_1,y_2,...,y_k y1?,y2?,...,yk?
定义 S G ( x ) = m e x ( S G ( y 1 ) , S G ( y 2 ) , . . . , S G ( y n ) ) SG(x)=mex(SG(y_1),SG(y_2),...,SG(y_n)) SG(x)=mex(SG(y1?),SG(y2?),...,SG(yn?))
其中 m e x ( S ) = m i n x ∈ N , x ? S { x } mex(S)=min_{x \in N, x \notin S }\{x\} mex(S)=minxN,x/?S?{x}
m e x ( S ) mex(S) mex(S)等于不属于集合S最小非负整数

规定起点为s的有向图游戏G有 S G ( G ) = S G ( s ) SG(G)=SG(s) SG(G)=SG(s)

G 1 , G 2 , . . . , G k G_1,G_2,...,G_k G1?,G2?,...,Gk?为k个有向图游戏
若有向图游戏 G G G的操作规则为任选某个有向图游戏 G i G_i Gi?并在 G i G_i Gi?上行动一次
G G G被称为 G 1 , G 2 , . . . , G k G_1,G_2,...,G_k G1?,G2?,...,Gk?的和,有
S G ( G ) = S G ( G 1 ) ? x o r ? S G ( G 2 ) ? x o r ? . . . ? x o r ? S G ( G n ) SG(G)=SG(G_1)\ xor\ SG(G_2)\ xor\ ...\ xor\ SG(G_n) SG(G)=SG(G1?)?xor?SG(G2?)?xor?...?xor?SG(Gn?)

ICG与SG函数的关系

规定有向图游戏中没有出边的结点 x x x S G ( x ) = 0 SG(x)=0 SG(x)=0,则有

有向图游戏某个局面 x x x必胜,当且仅当 S G ( x ) > 0 SG(x)>0 SG(x)>0
有向图游戏某个局面 x x x必负,当且仅当 S G ( x ) = 0 SG(x)=0 SG(x)=0

一个简单的证明如下:
若结点x的某后继节点y有SG(y)=0,则mex运算后一定有SG(x)>0
即处于局面x的玩家只要向局面y移动,则一定能必胜

若结点x的后继节点均有SG(y)>0,则mex运算后一定有SG(x)=0
即处于局面x的玩家无论如何操作都一定会到达必败局面

SG函数的应用

POJ2311 Cutting Game

题目大意:有一张wh的网格纸,每次操作可选择任意一张网格纸,沿格线水平或垂直将纸剪成两张,先剪出11的玩家获胜,在两名玩家均采取最优策略的情况下,先手是否必胜?

题目分析
首先将该游戏转化为有向图游戏
显然可以让每个结点表示有一张 n ? m n*m n?m网格纸的游戏
那么每次剪切(水平为例)后会产生两个 i ? m i * m i?m 网格纸和 ( n ? i ) ? m (n-i)*m (n?i)?m 网格纸的新游戏
所以 S G ( n , m ) = m e x ( { S G ( i , m ) ? x o r ? S G ( n ? i , m ) ∣ 2 ≤ i ≤ n ? 2 } ? { S G ( n , i ) ? x o r ? S G ( n , m ? i ) ∣ 2 ≤ i ≤ m ? 2 } ) SG(n,m)=mex(\{SG(i,m)\ xor\ SG(n-i,m)|2\leq i \leq n-2\} \bigcup \{SG(n,i)\ xor\ SG(n,m-i)|2\leq i \leq m-2\}) SG(n,m)=mex({SG(i,m)?xor?SG(n?i,m)2in?2}?{SG(n,i)?xor?SG(n,m?i)2im?2})

边界条件 S G ( 2 , 2 ) = S G ( 2 , 3 ) = S G ( 3 , 2 ) = 0 SG(2,2)=SG(2,3)=SG(3,2)=0 SG(2,2)=SG(2,3)=SG(3,2)=0
因为2x2,2x3,3x2的网格纸无论怎么剪都会产生1*x的纸,使得对方一定可以剪出1 * 1

#include<iostream>
#include<cstdlib> 
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;

int read()
{
    int f=1,x=0;
    char ss=getchar();
    while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
    while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
    return x*f;
}

int SG[210][210];

int getSG(int n, int m)
{
	if(SG[n][m]!=-1) return SG[n][m];
	
	int check[250];
	memset(check, 0, sizeof(check));
	
	for(int i=2;i<=n-i;++i)
	{
		int sg=getSG(i,m)^getSG(n-i,m); 
		check[sg]=1;
	}
	
	for(int i=2;i<=m-i;++i)
	{
		int sg=getSG(n,i)^getSG(n,m-i); 
		check[sg]=1;
	}
	
	int mex=0;
	for(int i=0;i<250;++i)
	if(!check[i]){
		mex = i;
		break;
	}
	
	return SG[n][m]=mex;
}

int main()
{	
	memset(SG, -1, sizeof(SG));
	SG[2][2]=SG[2][3]=SG[3][2]=0;
	
	int w,h;
	while(scanf("%d%d",&w,&h)!=EOF)
	{
		if(getSG(w,h)==0) printf("LOSE\n");
		else printf("WIN\n");
	}
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:31:11  更:2021-09-13 09:32:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:24:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码