UVA 1378 A Funny Stone Game (经典博弈)
来源:互联网 发布:mac 最好的五笔输入法 编辑:程序博客网 时间:2024/05/21 14:59
题目传送门
代码不是关键,关键的是对博弈和sg函数的理解。重点是在构造sg函数的时候是将一个石头看成一个堆,所以按照sg函数的定义后继状态为两个石头构成的堆。然后根据对称性原理和xor的性质,在某个堆,只有石头个数为奇数时才会对参与xor,才会对最后答案有贡献。
最后枚举第一步操作的可能性使得xor为0即转入必败态。此时相当于去掉第i个堆里的一个石头,在第j堆和第k堆加上个一块石头。
#include <bits/stdc++.h>using namespace std;const int N=100005;int vis[80],sg[30],num[30];int init(){ sg[1]=0; for(int i=2;i<=23;i++) { memset(vis,0,sizeof(vis)); for(int j=1;j<i;j++) { for(int k=1;k<=j;k++) { vis[sg[j]^sg[k]]=1; } } for(int q=0;q<80;q++) { if(!vis[q]) { sg[i]=q; break; } } } return 0;}int main(){ int n,t=0; init(); while(scanf("%d",&n)!=EOF) { int ans=0; if(!n) break; for(int i=1;i<=n;i++) { scanf("%d",&num[i]); if(num[i]&1) { ans^=sg[n+1-i]; } } cout<<ans<<endl; printf("Game %d: ",++t); if(!ans) { printf("-1 -1 -1\n"); continue; } int flag=1; for(int i=1;i<=n&&flag;i++) { if(num[i]) for(int j=i+1;j<=n&&flag;j++) { for(int k=j;k<=n&&flag;k++) { if((ans^sg[n+1-i]^sg[n+1-j]^sg[n+1-k])==0) { printf("%d %d %d\n",i-1,j-1,k-1); flag=0; } } } } } return 0;}
0 0
- UVA 1378 A Funny Stone Game (经典博弈)
- UVA 1378 - A Funny Stone Game(博弈)
- uva 1378 A Funny Stone Game (博弈-SG)
- uva 1378 - A Funny Stone Game sg博弈
- [博弈]A Funny Stone Game
- uva 1378 A Funny Stone Game 博弈/组合游戏 sg定理
- uva 1378 - A Funny Stone Game sg函数
- uva 1378 - A Funny Stone Game(组合游戏)
- UVA - 1378 A Funny Stone Game (SG定理)
- uva 1378 A Funny Stone Game(博弈论)
- LA 3668 A Funny Stone Game(博弈,SG定理)
- sg函数_______A Funny Stone Game(uva 1378)
- poj2484 A Funny Game 博弈
- [nim博弈扩展 sg函数] UVALive 3668 A Funny Stone Game
- uva1378 - A Funny Stone Game SG函数
- [UVA1378] A Funny Stone Game && SG函数
- UVA1378A Funny Stone Game
- Sicily 1087. A Funny Game[博弈]
- WebView
- php+mysqli事务
- List+Tuple+Dict知识整理
- ASP.NET Web API 基本操作(CRUD)
- 位运算之快速幂
- UVA 1378 A Funny Stone Game (经典博弈)
- cookie机制和session机制的原理一区别
- 数据链路层主要协议
- 简单工厂模式,工厂方法模式,抽象工厂模式
- 二进制安装mysql
- 欢迎使用CSDN-markdown编辑器
- leecoda第二题
- 9.13 C和C++ 13.8编写一个智能指针类
- SQL Server 提高执行效率的16种方法