hdu1730 nim博弈
来源:互联网 发布:电脑像素画软件 编辑:程序博客网 时间:2024/05/16 09:06
题意:游戏在一个n行m列(1 ≤ n ≤ 1000且2 ≤ m ≤ 100)的棋盘上进行,每行有一个黑子(黑方)和一个白子(白方)。执黑的一方先行,每次玩家可以移动己方的任何一枚棋子到同一行的任何一个空格上,当然这过程中不许越过该行的敌方棋子。双方轮流移动,直到某一方无法行动为止,移动最后一步的玩家获胜。Tom总是先下(黑方)。
解法:其实是等效于nim游戏的。相当于n堆石子,每堆石子的数量等于每行黑白棋子间有多少个空格。如果全部都没有空格了,那么先走的必败,因为后走的可以贴着先走的棋子走,而对方一定在有限步之内穷途陌路,这时就相当于石子取完了。直观不同于nim的是,这里有可能通过反向移动,相当于增加石子,不过这也不会改变必胜必败态的。因为如果此时该走之人出于必胜态,那么就不必反向移动了,如果是必败态想通过增加石子改变必败态,那么另一方可以走相同的方向和步数来维持自己的必胜态,而耍赖一方的耍赖次数也是有限的。 到此模型就完全等价于nim游戏了。
代码:
/***************************************************** author:xiefubao*******************************************************/#pragma comment(linker, "/STACK:102400000,102400000")#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <queue>#include <vector>#include <algorithm>#include <cmath>#include <map>#include <set>#include <stack>#include <string.h>using namespace std;#define eps 1e-8typedef long long LL;int n,m;int main(){ while(scanf("%d%d",&n,&m)==2) { int ans=0; for(int i=0;i<n;i++) { int a,b;scanf("%d%d",&a,&b); ans^=abs(b-a)-1; } if(ans) cout<<"I WIN!\n"; else cout<<"BAD LUCK!\n"; } return 0;}
0 0
- hdu1730 nim博弈
- HDU1730->Nim博弈
- Northcott Game(hdu1730变形的nim博弈)
- HDU1730距离的nim
- hdu1730尼姆博弈
- hdu1730 Northcott Game,Nim-sum
- hdu1730 Northcott Game 转换为距离NIM
- hdu1730 Northcott Game(s-nim)
- nim 博弈
- Nim博弈
- Nim博弈
- NIM 博弈
- Nim 博弈
- Nim博弈
- nim 博弈
- Nim博弈
- Nim博弈
- Nim博弈
- 【静态链接】第2章---------------------目标文件(符号)
- The connection to adb is down, and a severe error has occured.
- 如何解释企业服务总线(ESB)
- RandomAccessFile
- 黑马程序员-第十五天( Set集合)
- hdu1730 nim博弈
- KMP算法详解
- 20140302培训感悟
- DataInputStream 和DataOutputStream用于操作Java的基本数据类型
- Big-endian and little-endian
- PS教程:一分钟搞定 超简单PS皮肤美白方法
- 最长回文串
- 黑马程序员-第十六天( Map集合)
- SpringMVC入门教程 附jar包依赖关系