UVA1378 A Funny Stone Game —— SG博弈
题目链接:https://vjudge.net/problem/UVA-1378


题意:
两个人玩游戏,有n堆石子,两人轮流操作:于第i堆石子中取走一块石子,然后再往第j、k堆中各添加一块石子。其中 i<j, j<=k。最后一次操作的为赢家,问先手能否必胜,如果能,请输出第一步操作。
题解:
1.把每个石子都看成是一个子游戏,所以在第i堆的其中一个石子,它的下一步为第j堆和第k堆;即这个子游戏又可以分解为两个子游戏。
2.由于在同一堆里的石子状态完全相同,所以当这堆石子的个数为偶数时,他们的SG值异或和为0;当个数为奇数时,他们的SG值异或和即为单独一个石子的SG值。
3.那么怎么求在第i堆里一个石子的SG值呢?一般情况下子游戏的下标是较小的,而处于第i堆的石子游戏又可以分解为处于第j、k石子的子游戏,然后i是小于j、k的,所以我们就把下标翻过来,这样就满足的SG的求值过程。初始状态为SG[0] = 0,即位于第0堆时,无法操作,即无后续状态,所以 SG[0] = mex{} = 0。
4.至于输出第一步,枚举ijk,得到一个必败状态即可。为何是必败状态?因为先手是处于必胜状态,当先手操作了一轮之后,轮到后手,而后手就处于必败状态。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int MOD = 1e9+;
const int MAXN = +; int a[MAXN], SG[MAXN], vis[]; void getSG()
{
SG[] = ;
for(int i = ; i<MAXN; i++)
{
memset(vis, , sizeof(vis));
for(int j = ; j<i; j++)
for(int k = ; k<=j; k++)
vis[SG[j]^SG[k]] = ; //下一个状态,由两个子游戏组成,故异或。 for(int j = ;;j++) if(!vis[j]) {
SG[i] = j;
break;
}
}
} int main()
{
getSG();
int n, kase = ;
loop:
while(scanf("%d",&n) && n)
{
int val = ;
for(int i = ; i<n; i++)
{
scanf("%d", &a[i]);
if(a[i]%) val ^= SG[n--i]; //当个数为奇数时,才有效
} printf("Game %d: ", ++kase);
for(int i = ; i<n-; i++) //枚举、模拟第一步操作
{
if(a[i]==) continue; //如果这堆没有石子,那就不能取了。
for(int j = i+; j<n; j++)
for(int k = j; k<n; k++) //取走i堆一块石子,往j、k堆中各加一个石子,即撤销i堆中一个子游戏
if((val^SG[n-i-]^SG[n--j]^SG[n--k])==){ //j、k堆中增加一个游戏。异或的作用是:有则去之无则添之。
printf("%d %d %d\n", i, j, k);
goto loop;
}
}
printf("-1 -1 -1\n");
}
return ;
}
UVA1378 A Funny Stone Game —— SG博弈的更多相关文章
- uva 1378 - A Funny Stone Game sg博弈
题意:David 玩一个石子游戏. 游戏中,有n堆石子,被编号为0..n-1.两名玩家轮流取石子. 每一轮游戏.每名玩家选取3堆石子i,j,k(i<j,j<=k,且至少有一枚石子在第i堆石 ...
- UVA12293 Box Game —— SG博弈
题目链接:https://vjudge.net/problem/UVA-12293 题意: 两人玩游戏,有两个盒子,开始时第一个盒子装了n个球, 第二个盒子装了一个球.每次操作都将刷量少的盒子的球倒掉 ...
- UVA1482 Playing With Stones —— SG博弈
题目链接:https://vjudge.net/problem/UVA-1482 题意: 有n堆石子, 每堆石子有ai(ai<=1e18).两个人轮流取石子,要求每次只能从一堆石子中抽取不多于一 ...
- HDU 1848(sg博弈) Fibonacci again and again
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 【UVA1378】A Funny Stone Game (博弈-求SG值-输出方案)
[题目] Description The funny stone game is coming. There are n piles of stones, numbered with 0, 1, 2, ...
- uva 1378 A Funny Stone Game (博弈-SG)
题目链接:http://vjudge.net/problem/viewProblem.action?id=41555 把第i堆的每个石子看出一堆个数为n-i的石子,转换为组合游戏 #include & ...
- UVALive 3668 A Funny Stone Game(博弈)
Description The funny stone game is coming. There are n piles of stones, numbered with 0, 1, 2,..., ...
- hdu 1851(A Simple Game)(sg博弈)
A Simple Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others)Tot ...
- poj 1740 A New Stone Game(博弈)
A New Stone Game Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 5338 Accepted: 2926 ...
随机推荐
- 洛谷——P2919 [USACO08NOV]守护农场Guarding the Farm
P2919 [USACO08NOV]守护农场Guarding the Farm 题目描述 The farm has many hills upon which Farmer John would li ...
- mysql 设置不了短串密码怎么办 You must reset your password using ALTER USER statement before executing this statement.
centos7+ 安装 mysq 5.7 https://www.linuxidc.com/Linux/2016-09/135288.htm set global validate_password_ ...
- 无向图的点双连通分量(tarjan模板)
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #i ...
- Android Developer:Allocation Tracker演示
这个演示展示了Allocation Tracker工具在Android Studio中的基本使用方法和流程. Allocation Tracker记录了一个app的内存分配,列出全部分配对象,用于分析 ...
- 批量杀死mysql进程
http://www.chengyongxu.com/blog/%E6%89%B9%E9%87%8F%E6%9D%80%E6%AD%BBmysql%E8%BF%9B%E7%A8%8B/
- mysql:“Access denied for user 'root@IP地址'"
请仔细.再仔细确认你的用户名.密码.IP是否有误! 可悲的我老犯这种低级错误,以为用户没权限访问,唉..
- 逆向project实战--Afkayas.1
0x00 序言 去年玩了几个月的渗透測试,当初认为非常高端的样子.如今看来只是都是些小把戏,于是開始折腾逆向project. 学习过程中參考的是<逆向project核心原理>这本书.讲的非 ...
- 安卓版本6.0打开uiautomator报错
可能是appium打开了,被占用:或者是找不到手机
- 继承的文本框控件怎么响应EN_CHANGE等消息
继承的文本框控件如何响应EN_CHANGE等消息?我从CEdit继承了一个CMyEdit类,想在这个类里填写它的一些消息.我在消息映射表里写的是MESSAGE_HANDLER(EN_CHANGE, O ...
- Presenting view controllers on detached view controllers is discouraged
本文转载至 http://www.xuebuyuan.com/2117943.html Presenting view controllers on detached view controllers ...