HDU 3032 Nim or not Nim? (博弈之求SG函数)

题意:经典Nim博弈游戏变换,给你n堆石子pi,每堆有pi个石子,

Alice和Bob轮流取石子,每次可以从任意一堆中拿走任意个石子,也可以将某一堆石子分成两个小堆

(每堆石子个数必须不能为0),先拿完者获胜

思路:求SG函数后找规律;

SG函数定义及求法:点击打开链接

#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
#define INF 1e8
#define eps 1e-8
#define LL long long
#define maxn 1000001
#define PI acos(-1.0)

int sg[maxn],vis[maxn];

void SG()
{
	sg[0]=0;
	sg[1]=1;
	for(int i=2;i<100;i++)
	{
		memset(vis,0,sizeof(vis));
		for(int j=i-1;j>=0;j--)
		{
			vis[sg[j]]=1;
		}
		for(int j=1;j<i;j++)
		{
			int state=sg[j]^sg[i-j];
			vis[state]=1;
		}
		for(int j=0;j<maxn;j++)
		{
			if(!vis[j])
			{
				sg[i]=j;
				break;
			}
		}
	}
	for(int i=97;i<maxn;i+=4)
	{
		sg[i]=i;
		sg[i+1]=i+1;
		sg[i+2]=i+3;
		sg[i+3]=i+2;
	}
}
int main()
{
	SG();
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n;
		scanf("%d",&n);
		int st=0;
		for(int i=0;i<n;i++)
		{
			int a;
			scanf("%d",&a);
			int p=a%4;
			int m;
			if(p==0)
			{
				m=a-1;
			}
			else if(p==3)
				m=a+1;
			else m=a;
			st^=m;
		}
		if(st==0)
			printf("Bob\n");
		else printf("Alice\n");
	}
	return 0;
}

HDU 3032 Nim or not Nim? (博弈之求SG函数)

时间: 2024-10-19 09:31:24

HDU 3032 Nim or not Nim? (博弈之求SG函数)的相关文章

hdu 1760 A New Tetris Game 博弈~~搜索求sg函数

A New Tetris Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1176    Accepted Submission(s): 557 Problem Description 曾经,Lele和他姐姐最喜欢,玩得最久的游戏就是俄罗斯方块(Tetris)了. 渐渐得,Lele发觉,玩这个游戏只需要手快而已,几乎不用经过大

HDU 1536 S-Nim 求SG函数

题意:给你n个数Nnum[ i ],表示每次只能取Nnum[ i ]个数. m个问题:每次给你 l 堆石子,每堆有num个石子,问先手是否会赢. 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 经典Nim游戏,找出SG就可以了. 至于如何找SG,这里有详细的 点我 #include<cstdio> #include<

博弈算法 之 SG 函数的运用

SG函数简介: 如果我们把游戏中的某一个局面看作一个顶点,把局面之间的转换用边来表示,那么很多游戏都可以转 化成图游戏模型. 图游戏模型 给定有向无环图G=(V,E)和一个起始点,双方轮流行动.每个人每次可以从当前点出发沿着 一条有向边走到另外一个点.谁无法走了谁就输. 一些图游戏可以通过Sprague-Grundy函数来判定先手的胜负情况(简称SG函数). SG函数 一个图G=(V,E)的SG函数g,是定义在v上的一个非负整数函数: g(x)=min{n>=0 | n≠g(y) for <x

HDU 5795 A Simple Nim 打表求SG函数的规律

A Simple Nim Problem Description Two players take turns picking candies from n heaps,the player who picks the last one will win the game.On each turn they can pick any number of candies which come from the same heap(picking no candy is not allowed).T

【转】博弈问题及SG函数(真的很经典)

博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要看“博弈论”的时候.) Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了. Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”

(转)博弈问题与SG函数

博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要看“博弈论”的时候.) Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了. Nim游戏是组合游戏(Combinatorial Games)的一种,准确来说,属于“Impartial Combinatorial Games”

博弈问题及SG函数

转载自:http://blog.csdn.net/scut_pein/article/details/39272489 博弈问题若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需要看“博弈论”的时候.) Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了. Nim游戏是组合游戏(Co

hdu 1524 A Chess Game 博弈之,SG函数简单题

A Chess Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1489    Accepted Submission(s): 679 Problem Description Let's design a new chess game. There are N positions to hold M chesses in th

hdu 3032 Nim or not Nim? 博弈论,,,网上搜的题解让我大开眼界,原来还可以这样A题

Nim or not Nim? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1076    Accepted Submission(s): 532 Problem Description Nim is a two-player mathematic game of strategy in which players take tur