POJ2975--NIM博弈问题
来源:互联网 发布:xp如何安装网络打印机 编辑:程序博客网 时间:2024/06/07 00:15
题目:有几堆石子,两个人从中取,一次可以取多个(至少一个),当某个人取的时候石子为0,则这个人输,问在自己有必赢策略情况下,第一步可以取哪些堆的石子,使得对方为必输状态?
首先要知道NIM博弈问题的结论;
对于一个局面,当且仅当A[1] xor A[2] xor ... xor A[N] = 0时,该局面为P局面,也就是必输局面当不等于0的时候,存在必赢策略
思路:
首先判断自己是否为必输局面,为必输局面则输出0
有赢得策略的话,分析第一步怎么走才能使得对方为必输状态,详细的解释在代码注释中
import java.util.Scanner;public class Test2 { public static void main(String[] args) { Scanner input = new Scanner(System.in); int count = 0; int n; while((n = input.nextInt())!=0){ int[] arr = new int[n]; for (int i = 0; i < arr.length; i++) { arr[i] = input.nextInt(); } int remain = 0; for (int i = 0; i < arr.length; i++) { remain = remain^arr[i];//根据公式推算出有没有必胜的策略 } //如果没有则输出0 if (remain == 0) { System.out.println(0); }else {//存在必胜策略,但不一定胜利,分析出能胜利的第一步方案 for (int i = 0; i < arr.length; i++) { /** * 原本remain = arr[1]^arr[2]---- * 现在remain^arr[i]意思是假设不存在这个堆,剩余的堆能推测出的状态假设为s个石子, * 只要s比当前堆小,我们就可以在第一步的时候取出一定石子.让当前堆变成s个石子, * 这样的话自己走完第一步,对于对方来说,就是必输状态 */ if ((remain^arr[i]) < arr[i]) { count++; } } System.out.println(count); } } }}
0 0
- POJ2975--NIM博弈问题
- 【POJ2975】Nim (博弈)
- 【POJ2975】Nim 博弈
- poj2975 Nim 博弈
- Poj2975(NIM博弈)
- POJ2975(Nim博弈)
- poj2975 nim(nim博弈)
- [POJ2975]Nim游戏(博弈)
- poj2975 Nim博弈好题
- POJ2975 & ZOJ3067 Nim [基础Nim博弈]输出方法
- [poj2975]Nim
- poj2975 Nim
- poj2975 Nim
- POJ2975:Nim
- 【poj2975】Nim
- Nim POJ2975
- POJ2975 Nim
- poj2975,hdu1850,hdu2176(Nim博弈求方案数)
- 在ubuntu中安装./install时,提示权限不够怎么办?
- Sublime Text 3的下载安装
- rk3288编译环境
- OS App的性能优化
- CoreData 多线程使用方法
- POJ2975--NIM博弈问题
- Android游戏编程笔记(一)
- Android绚丽加载效果视图(loading)控件
- "XXX cannot be resolved to a type "eclipse报错及解决说明
- Three.js显示中文字体
- 邓迪大学信息无障碍典型文献技术剖析
- 数据归一化小结
- Web.xml配置详解之context-param
- Kafka单机、集群模式安装详解(二)