爱奇艺2017校招-Java开发-在线算法笔试题-NIM博弈问题,牛牛羊羊吃草
来源:互联网 发布:哈!算法2-伟大思维闪耀 编辑:程序博客网 时间:2024/04/30 12:32
题目为:
典型的NIM问题,博弈问题,对应每个石子数n可以分为两种状态:
N:先手赢
P:后手赢
NIM(n-1) NIM(n-4) NIM(n-16) NIM()… NIM(n)
1 1 1 1 0
0 0 0 0 1
0 0 0 1 1
运行结果:
牛牛和羊羊吃草,有t捆,每捆n个,两个人玩一个游戏,规则为,每个人每次只能吃4的幂,即1个,4个,或者16个。。。,直到无草可吃为输,每个人均会按照最佳策略进行。
输入t为堆数,之后输入每堆的个数;
如果牛牛赢,输出niu
如果羊羊赢,输出yang
512345niuyangniuniuyang
典型的NIM问题,博弈问题,对应每个石子数n可以分为两种状态:
N:先手赢
P:后手赢
- (n)代表此刻的石子数量,因为每次可以拿1,4,16,...对应的子状况为(n-1),(n-4),(n-16)
- (0)时,自己没有石子可拿,一定对手赢,状态为P
- (1)时,自己全拿走一定赢,先手赢,状态N
- (2)时,自己拿一个,对手拿走一个,自己肯定输,(2)对应子状态(1)为N,所以(2)为P
- (3)时,对应子状态为(2)状态为P,所以(3)为N
- (4)时,对应子状态为(0)-》P,(3)-》N,考虑到每个人会选择最佳策略,为了赢选择P(0),此时变为N
- (5)时,可以选择拿1个,对应(4)为N 拿4个,对应(1)为N,都是先手赢,所以(5)为P,是后手赢
- (6)时,可以选择拿1个,对应(5)为P, 拿4个,对应(2)为P,都是后手赢,所以(6)为N,是先手赢
- ….
- 以此类推,(17)时,子状态(1) (13) (16)..
NIM(n-1) NIM(n-4) NIM(n-16) NIM()… NIM(n)
1 1 1 1 0
0 0 0 0 1
0 0 0 1 1
0 0 1 1 1
核心是
只要子状态包含P后手赢,那么为了赢,一定会选择这个状态为P的子状态,让自己赢如果子状态都是N先手赢,那么无论怎么做,轮到下一个都必赢,自己一定会输。
import java.util.Scanner;/** * Created by Luna on 2017/10/14. */public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int loop = input.nextInt(); int c=0; int[] num = new int[loop]; while (c<loop){ num[c]=input.nextInt(); c++; } for (int i = 0; i < loop; i++) { System.out.println(NIM(num[i])?"niu":"yang"); } } public static boolean NIM(int k) { if (k==0) return false; if (k==1) return true; int tmp=1; int count=-1; while(tmp<=k){ //判断输入值包含4的k次幂,对应有k+1个子状况 if(tmp==k) return true; tmp<<=2; count++; } for (int i = 0; i <=count ; i++) { int next=k - (int)Math.pow(4, i); if(!NIM(next)) return true; //只要包含false 那么就选择它,让自己赢 } return false;//如果子状况都是先手赢,那么自己必输。 }}
运行结果:
512345niuyangniuniuyang
51619314276niuniuniuyangniu
阅读全文
0 0
- 爱奇艺2017校招-Java开发-在线算法笔试题-NIM博弈问题,牛牛羊羊吃草
- 笔试——牛羊吃草
- 牛羊吃草问题求解(downmoon)
- [2017腾讯校招在线笔试题]
- 滴滴2017校招算法工程师笔试题--吃饭问题
- 百度2017校招java研发在线笔试
- 中兴2017校招软件在线笔试题
- 2017 8.25 阿里巴巴校招 在线笔试题
- 2015阿里巴巴校招在线笔试题
- 2015阿里巴巴校招在线笔试题
- 2016CVTE校招在线笔试题
- 2015 阿里校招 Web前端开发 在线笔试总结
- 2016年腾讯校招在线笔试UI开发总结
- 2014年8月29日阿里校招在线笔试部分题--软件测试开发
- 阿里巴巴2015秋季校招(客户端开发工程师岗位)在线笔试题
- 名企笔试:蘑菇街2017校招笔试题(修理桌子问题)2017-03-09 算法爱好者
- 完美世界校招在线笔试题-互联网Java(11月1日)编程题
- 牛吃草问题
- 机器学习 第十周 总结 知识点
- JDBC Dao的实现与测试
- Android so库的了解
- 2018秋招笔试 爱奇艺20171014 字符串价值
- opencv-python(12):图像梯度(高通滤波)
- 爱奇艺2017校招-Java开发-在线算法笔试题-NIM博弈问题,牛牛羊羊吃草
- Mysql 没有nvl()函数,却有一个类似功能的函数ifnull();
- sscanf使用笔记
- Django学习笔记(六)--models与mysql数据库接入
- Qt学习之-简易音乐播放器
- django:自定义静态文件服务器
- Python全局变量与局部变量的区别
- Android APP启动界面(动画)
- 算法第六周Remove Element[easy]