Nim博弈

博弈论之SG函数(NIM博弈、反NIM博弈证明+例题)--POJ2311 目录 NIM博弈: 题目: 代码: 反NIM博弈: 题目: 代码: 公平组合游戏ICG: 有向图游戏: Mex运算: SG函数: 有向图游戏的和: 定理: 题目: 代码: 参考材料: NIM博弈: 内容:给定N堆物品,第i堆物品有Ai个。两名玩家轮流行动,每次可以任选一堆,取走任意多个物品,可把一堆取光,但不能不取。取走最后一件物品者获胜。两人都采取最优策略,问先手是否必胜。 定理:NIM博弈先手必胜,当且仅当 A1 ^ A2 ... 阅读详情
Nim 游戏的拓展、每次只能取限定个数个石子。 据说所有的组合游戏都可以转化为Nim游戏模型并用SG函数求解。
自己写了一遍SG函数的实现过程、感觉就是一个记忆化搜索的过程……

S-Nim

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 3506    Accepted Submission(s): 1539
 
Problem Description
Arthur and his sister Caroll have been playing a game called Nim for some time now. Nim is played as follows:


  The starting position has a number of heaps, all containing some, not necessarily equal, number of beads.

  The players take turns chosing a heap and removing a positive number of beads from it.

  The first player not able to make a move, loses.


Arthur and Caroll really enjoyed playing this simple game until they recently learned an easy way to always be able to find the best move:


  Xor the number of beads in the heaps in the current position (i.e. if we have 2, 4 and 7 the xor-sum will be 1 as 2 xor 4 xor 7 = 1).

  If the xor-sum is 0, too bad, you will lose.

  Otherwise, move such that the xor-sum becomes 0. This is always possible.


It is quite easy to convince oneself that this works. Consider these facts:

  The player that takes the last bead wins.

  After the winning player's last move the xor-sum will be 0.

  The xor-sum will change after every move.


Which means that if you make sure that the xor-sum always is 0 when you have made your move, your opponent will never be able to win, and, thus, you will win. 

Understandibly it is no fun to play a game when both players know how to play perfectly (ignorance is bliss). Fourtunately, Arthur and Caroll soon came up with a similar game, S-Nim, that seemed to solve this problem. Each player is now only allowed to remove a number of beads in some predefined set S, e.g. if we have S =(2, 5) each player is only allowed to remove 2 or 5 beads. Now it is not always possible to make the xor-sum 0 and, thus, the strategy above is useless. Or is it? 

your job is to write a program that determines if a position of S-Nim is a losing or a winning position. A position is a winning position if there is at least one move to a losing position. A position is a losing position if there are no moves to a losing position. This means, as expected, that a position with no legal moves is a losing position.
 

Input
Input consists of a number of test cases. For each test case: The first line contains a number k (0 < k ≤ 100 describing the size of S, followed by k numbers si (0 < si ≤ 10000) describing S. The second line contains a number m (0 < m ≤ 100) describing the number of positions to evaluate. The next m lines each contain a number l (0 < l ≤ 100) describing the number of heaps and l numbers hi (0 ≤ hi ≤ 10000) describing the number of beads in the heaps. The last test case is followed by a 0 on a line of its own.
 

Output
For each position: If the described position is a winning position print a 'W'.If the described position is a losing position print an 'L'. Print a newline after each test case.
 

Sample Input
2 2 5
3
2 5 12
3 2 4 7
4 2 3 7 12
5 1 2 3 4 5
3
2 5 12
3 2 4 7
4 2 3 7 12
0
 

Sample Output
LWW
WWL
 

Source
 

Recommend
LL
 

至于S-Nim 为什么能向 Nim 转化。感觉这个分析很到位:

S-Nim类的游戏转化为Nim游戏,并将每个点当做一堆石子,该点的SG值当做该堆的石子数。但是为什么SG值有什么意义?为什么可以转化为石子数?只有理解了SG值的确切意义才能完全明白为什么S-Nim向Nim的转化。看一下以下例子:

                                     SG=g(x)={0,1,2,3}=4      ............................................. ①

                                     SG=g(x)={0,1,2,3,5}=4   ..............................................②   

                                     SG=g(x)={1,2,3,5}=0   .................................................③

对比①和②可以发现,SG值似乎丢失了一些信息,②中的5值并没有通过SG值表示出来。对比②和③可以发现,③中信息似乎完全丢失了。但,是不是真的如此呢?回到博弈类题目的出发点:

 一、博弈题目依据什么推测最终的输赢?

        答:依据的是当前点处于必胜点,还是必败点。除此之外无需假借任何条件。

二、必胜点与必败点有什么性质。

        答:(1) 所有终结点是必败点(P点);

                (2) 从任何必胜点(N点)操作,至少有一种方法可以进入必败点(P点);

                (3)无论如何操作, 从必败点(P点)都只能进入必胜点(N点).

然后,看一下SG值,SG值为零的点,则为P点(即,必败点),否则为N点(即,必胜点)。以上SG值的性质满足必败点与必胜点的所有性质:(1)所有终结点的SG值为零,为必败点。(2)若SG值不为零,则其为必胜点。设其值为m,则有SG=g(x)={0,1,2,....m-1}=m,大括号中的0为其后继点的SG值,即该点为必败点。所以满足从必胜点至少有一种方法进入必败点。(3)若,SG值为零的点不是终结点,则必存在一个值为m的点,使得SG=g(x)={...,m,...},大括号中的m为其后继点的SG值,即该点为必胜点。所以满足从必败点都只能进入必胜点。

         综上所诉,SG值为零的点,则为P点(即,必败点),否则为N点(即,必胜点)。满足必胜点与必败点所有的性质。并且可以作为推测输赢的依据。例②中所谓的信息丢失并不存在,因为SG值仅仅关注零和非零,其重点在于后继点的SG值中是否存在零。例③中的信息同样并未丢失,因为其SG值为零恰恰表明了后继点中有不为零的值存在(或无后继点),而必败点仅仅关心这一点信息。所以SG值仅有两个意义,零和非零,标明了该点为必胜点还是必败点。 因为石子的数量与SG值起到的相同的作用(标明必胜点或者必败点) ,因此S-Nim类题目转化为Nim类题目时可以将SG值与石子数量同等对待,更是因为如此S-Nim题目才可以转化为Nim类题目。  

 (上述分析摘自:
http://www.cnblogs.com/AdaByron/archive/2011/08/07/2200981.html )

 

 

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

const int N = 100 + 10;
const int M = 1000 + 10;

int n;
int f[N],set[N];

int mex(int v)
{
    int g[N]={0};

    for(int i=0;i<n;i++)
    {
        int t=v-set[i];
        if(t<0)
            break;
        if(f[t]==-1)
            f[t]=mex(t);
        g[f[t]]=1;
    }

    for(int i=0;i<N;i++)
    {
        if(!g[i])
            return i;
    }
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        for(int i=0;i<n;i++)
            scanf("%d",&set[i]);
        sort(set,set+n);
        memset(f,-1,sizeof(f));
        f[0]=0;
        int m;
        scanf("%d",&m);
        for(int i=0;i<m;i++)
        {
            int c,k,res=0;
            scanf("%d",&c);
            for(int j=0;j<c;j++)
            {
                scanf("%d",&k);
                if(f[k] == -1)
                    f[k]=mex(k);
                res ^= f[k];
            }
            res == 0 ? printf("L") : printf("W");
        }
        printf("\n");
    }
    return 0;
}
GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图 本文详细介绍了如何将ArcGIS中的等高线和水系数据高效导入CAD,制作专业规划底图的5个关键步骤。从数据准备、ArcGIS处理到CAD优化,涵盖坐标系设置、数据裁剪、格式转换等实用技巧,特别适合设计规划领域的新手快速掌握GIS与CAD协同工作流程。 阅读详情

相关推荐

实战分享:如何利用svchost进程绕过360防护(附完整Shellcode注入教程)

本文深入解析系统进程安全防护机制,探讨svchost等关键进程的安全特性与防护策略。详细分析安全软件的行为检测和内存保护技术,提供系统加固与监控实践建议,助力企业构建多层次防御体系,有效应对潜在安全威胁。

weixin_30752699的博客 99

博弈论(Nim 游戏)

Mex运算设SSS表示一个非负整数集合。定义mex⁡SmexS为求出不属于集合SSSmex⁡Smin⁡xmexSminxxxx属于自然数,且xxx不属于SSS。有向图游戏给定一个有向无环图,图中有一个唯一的起点,在起点上放有一枚棋子。两名玩家交替地把这枚棋子沿有向边进行移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。任何一个公平组合游戏都可以转化为有向图游戏。

blind5883的博客 2566

SpotBugs实战:10大类Bug检测规则详解与代码优化实例(附避坑清单)

本文深入解析SpotBugs在Java开发中的实战应用,详细讲解10大类Bug检测规则与代码优化实例,包括NPE防御、多线程安全、性能优化等关键问题。通过具体代码示例和避坑清单,帮助开发者提升代码质量,有效集成到CI/CD流程中。

weixin_42665255的博客 196

(转载)Nim游戏博弈(收集完全版)

Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取。最后拿光珍珠的人输。 后来,在一份资料上看到,这种游戏称为“拈(Nim)”。据说,它源自中国,经由被贩卖到美洲的奴工们外传。辛苦的工人们,在工作闲暇之余,用石头玩游戏以排遣寂寞。后来流传到高级人士,则用便士(Pennies),在酒吧柜台上玩。 最有名的玩法,是把十二枚便

lethic的专栏 3711

Winform零基础从入门到精通(3)——WinForm基础语法与事件机制详解

通过系统学习基础语法与事件机制,结合实际问题调试,可以快速掌握WinForm开发的核心技能。遇到问题时,优先检查事件绑定和异常处理,逐步培养代码规范意识。​安全转换字符串为数值,避免输入错误导致的崩溃。验证输入(如仅允许数字)​)传递事件相关数据。◦ 事件参数类型:​。

WangMing_X的博客 1492

汽车底盘技术解析:从悬架调校到智能化,如何评价国产车底盘实力

汽车底盘作为决定车辆驾驶质感、安全性和耐久性的核心系统,其技术内涵远不止于悬架结构。从行驶系、转向系到制动系的协同工作,底盘调校是一门融合机械原理与工程实践的艺术。在电动化与智能化浪潮下,底盘技术正经历从被动适应到主动响应的变革,CDC可变阻尼减震器和空气悬架等技术的应用,让底盘具备了通过OTA升级实现性能优化的可能。国产汽车品牌如奇瑞、吉利等,通过平台化架构研发与调校经验积累,正推动底盘技术从“能用”向“好用”乃至“塑造独特驾驶风格”迈进。理解底盘技术,需超越简单的结构对比,关注其在实际路况中的滤震性、支

weixin_34413103的博客 387

尼姆博弈(Nimm's Game)

尼姆博弈(Nimm's Game) 题型 尼姆博弈模型,大致上是这样的: 有3堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取1个,多者不限,最后取光者得胜。   分析 1、首先自己想一下,就会发现只要最后剩两堆物品一样多(不为零),第三堆为零,那面对这种局势的一方就必败 那我们用(a,b,c)表示某种局势,首先(0,0,0)显然是必败态,无论谁面对(0,0,0) ,

EmilSinclair4391的博客 2404

OLED 驱动模块程序代码

作为嵌入式软件开发,可能经常会使用单片机连接驱动显示屏,实现人机交互的功能,通常可选择的有 OLED 和 LCD 等,其中相关驱动代码例程网上更是数不胜数。 本文介绍的是 OLED, 常见代表有 0.96 寸的OLED,网上也有很多相关的驱动代码,但是大部分代码都是能用即可,不是特别关注驱动代码的整体架构,以下是个人整理的 OLED 驱动代码,支持配置 SPI 和 IIC 两种接口方式(目前只是测试了 SPI,IIC 有待验证)。

大橙子的博客 4290

博弈论(Nim游戏)

题目要求:给你 n 堆石子,两个人轮流取石子,每次选择一堆,可以取出这一堆的任何数量的石子,直到某个人无法再取出任何石子,则另一个人就赢了。因此我们就可以创造先手的必胜态,则对于后手的来说一定是必输态。阶上去,直到最后台阶为0时,无法再移动,问能否先手必胜?,则可以证明,一个必胜态一定可以转换得到一个必输态。第一个人取第一堆,第二个人取第二堆,则第一个人必输。则通过上面的描述,一个必胜态一定可以转换为必输态。的位置,则最后就可以把一个必胜态转变为必输态。的情况,则就是甲先手赢的选择的情况。

ylh的博客 2393

创建XCP的CanApe工程

创建XCP的CanApe工程

weixin_44173919的博客 2891

【100%通过率】华为od机试C卷【出差 / 员工派遣】C++ 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2194

Nim博弈(博弈论)

1.https://www.acwing.com/problem/content/893/ 题目:给定n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。问如果两人都采用最优策略,先手是否必胜。 思路: 必胜状态(a1^ a2 …^an!=0):可以走到某一个必败状态 必败状态(a1^ a2 …^an==0):走不到任何一个必败状态 证明(参考算法进阶指南): (a1^ a2 …^an!=0)可以走到某一个必败状态 (a1^ a

weixin_45113721的博客 1665

C#实战:YOLOv5+海康工业相机上位机开发全攻略(从图像采集到检测落地)

工业场景下AI质检系统的开发需要综合考虑硬件适配性、算法性能和稳定性。本文针对新能源电池极片缺陷检测场景,提出基于海康工业相机+YOLOv5+C#的技术方案,涵盖以下关键点: 工业级技术选型:选择支持全局快门的海康相机、OpenCvSharp图像处理、YOLOv5s轻量化模型,确保在无GPU工控机上稳定运行。 开发流程优化: 海康SDK集成:详细说明DLL配置和常见报错解决方案 YOLOv5模型导出:强调batch=1、opset12等工业适配参数 相机采集封装:提供线程安全的C#封装类,支持触发采集模式

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1197

NIM博弈 基础

Nim 博弈游戏 博弈论最经典的模型之一. 最常见的游戏为,给你好几列(或者堆)的棋子, 每次可以且必须在某一堆棋子里面拿走1-n(n为这堆棋子的最大个数)个棋子,然后再由另一个人拿(规则相同),最终谁拿走了全部的棋子谁就赢. 玩家为先手. 第一堆: XXXXXX 数目为 a1 第二堆: XXXXXX 数目为 a2 第三堆: XXXXXX 数目为 a3 … 第n堆: XXXXXX 数目为 ...

pursue_my_life的博客 456

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Nim博弈与Anti-Nim博弈

Nim博弈的原题:今有若干堆火柴,两人依次从中拿取,规定每次只能从一堆中取若干根, 可将一堆全取走,但不可不取,最后取完者为胜,求必胜的方法。 ...

Uniontake 1068

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

博弈论--NIM游戏

NIM 游戏是一种经典的组合博弈,两名玩家轮流从若干堆石子中选择一堆,并从中取走任意数量的石子。无法继续操作的玩家判负。

mathematicians的博客 1383

博弈论之正反Nim博弈

玩家轮流从若干堆物品中的某一堆物品取若干数量物,结论:有 n 堆物品,数量分别为a1​a2​a3​...an​a1​⊕a2​⊕a3​⊕...⊕an​==0a1​⊕a2​⊕a3​⊕...⊕an​!00⊕0⊕...⊕0^和 == 0经过一步拿取​^和!= 0(也就是说每一堆物品数的异或和是由 0非 0 之间相互转换的)

ByteMaster_的博客 1149

数论 - 博弈论(Nim游戏)

博弈论又被称为对策论(Game Theory),既是现代数学的一个新分支,也是运筹学的一个重要学科。博弈论主要研究公式化了的激励结构间的相互作用,是研究具有斗争或竞争性质现象的数学理论和方法。博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。

2203_75327677的博客 2561

我谈阶梯博弈( Staircase Nim )

今天在POJ做了一道博弈题..进而了解到了阶梯博弈...下面阐述一下我对于阶梯博弈的理解..  首先是对阶梯博弈的阐述...博弈在一列阶梯上进行...每个阶梯上放着自然数个点..两个人进行阶梯博弈...每一步则是将一个集体上的若干个点( >=1 )移到前面去..最后没有点可以移动的人输.. 如这就是一个阶梯博弈的初始状态 2 1 3 2 4 ... 只能把后面的点往前面放.

zzyzzy12 9750

博弈论-Nim博弈

1.Nim博弈的起源很早,至于历史我们就不再说了,直接说它的使用场景。(1)依旧是两个人博弈,但是物品时n堆,每一堆有ai个。(2)每个人可以挑选一堆取走若干个,但是不能不取。(3)最先取完所有物品的人获胜。(4)结论:所以堆的物品的数量异或起来是0,先手必败。 2.一个Nim博弈的实例:Nim博弈。乍一看这题和Nim博弈有啥关系?其实仔细分析之后它就是个Nim博弈。首先n行,其实就是有n堆的物...

YG爱木木 1082

ACM-博弈之Nim和

在这篇文章中,我们将进击博弈论中稍微高级一些的内容,

我了个去 1694

博弈训练——nim与bash

本文主要记录和nim博弈,bash game的相关问题。题目: hdu 2188 悼念512汶川大地震遇难同胞——选拔志愿者 hdu 2149 Public Sale lightOJ 1253 Misere Nim lightoj 1247 Matrix Game hdu 1517 A Multiplication Gamehdu 2149 Public Sale(bash game)h

theArcticOcean 1172

理论: 博弈3: Nim博弈

Nim博弈原型个人定义: 有n堆石头, 每ai颗石头。 Alice和Bob分别从非空的石头堆中取走至少一颗石子。Alice先取, 取光所有的石头即为获胜。当双方都采取最优策略的时候, 谁会获胜? 严谨定义: 有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

sun897949163的博客 885

Nim游戏与阶梯Nim博弈

nim游戏 问题描述 一共有N堆石子,编号1~n,第i堆中有个a[i]个石子。 每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子, 至少取一颗,至多取出这一堆剩下的所有石子。 两个人轮流行动,取光所有石子的一方获胜。Aice为先手. 给定a,假设两人都采用最优策略,谁会获胜? 问题分析 从简单情况分析,如果轮到你的时候,只剩下一堆石子,那么此时的必胜策略肯定是把这堆石子全部拿完一...

小白的Coding之旅 700

Nim博弈问题

本题见过你就会,没见过是不会的 提示:Nim博弈问题的来源也是很残酷的 Nim博弈问题诞生于1840年之后,中国遭受世界各地强国的蹂躏,然后抓了很多奴隶去美国,跟当年的非洲三角贸易一样; 中国的奴隶在广州上船之后,去美国航行需要3个月,这时候实在是太无聊了,于是奴里们就想到了一个游戏,当时大家手里只有硬币 ,于是规定玩一个游戏: 从0–N-1位置放硬币,每个位置可以放很多硬币,俩人玩,分为先手与后手; 所谓先手,就是你先拿,选一个位置随意拿多少个都行 所谓后手,就是你后拿,选一个位置随意拿多少个都行 wi

weixin_46838716的博客 861

Nim博弈及其扩展

1.定义 有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负。 2.局面 给出如下定义: P-Position:Previous-player 刚刚走过的选手得胜的局势; N-Position: Next-player将要走的选手得胜的局势; 终结状态:没有合法的操作集。由Nim的定义,终结状

ww32cc的博客 1391
上一篇: XTUOJ 区间覆盖总长(线段树+离散化)
下一篇: poj 1655 Balancing Act
IT旅行
博客等级 码龄12年 3粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值