2022-07-15:一开始有21个球,甲和乙轮流拿球,甲先、乙后,
每个人在自己的回合,一定要拿不超过3个球,不能不拿。
最终谁的总球数为偶数,谁赢。
请问谁有必胜策略。
来自微众。人工智能岗。

答案2022-07-15:

21球,是甲赢。如果把21变成其他正整数,误以为甲也一定赢,但实际上是不一定。可能甲赢,乙赢,打平。
通过递归可以发现规律。1甲 3乙 5乙 7乙,9甲 11乙 13乙 15乙。

代码用rust编写。代码如下:

fn main() {let mut i = 1;while i < 500 {//let ans = win1(i,0,0,0);let ans = win(i);println!("i = {},ans = {}", i, ans);i += 2;}
}// balls = 21
// ball是奇数
fn win(balls: i32) -> String {return process(0, balls, 0, 0);
}
// 憋递归!
// turn 谁的回合!
// turn == 0 甲回合
// turn == 1 乙回合
// rest剩余球的数量
// 之前,jiaBalls、yiBalls告诉你!
// 当前,根据turn,知道是谁的回合!
// 当前,还剩多少球,rest
// 返回:谁会赢!
fn process(turn: i32, rest: i32, jia: i32, yi: i32) -> String {if rest == 0 {return if (jia & 1) == 0 {String::from("甲")} else {String::from("乙")};}// rest > 0, 还剩下球!if turn == 0 {// 甲的回合!// 甲,自己赢!甲赢!for pick in 1..=get_min(rest, 3) {// pick 甲当前做的选择if process(1, rest - pick, jia + pick, yi) == "甲" {return String::from("甲");}}return String::from("乙");} else {for pick in 1..=get_min(rest, 3) {// pick 甲当前做的选择if process(0, rest - pick, jia, yi + pick) == ("乙") {return String::from("乙");}}return String::from("甲");}
}fn get_min<T: Clone + Copy + std::cmp::PartialOrd>(a: T, b: T) -> T {if a < b {a} else {b}
}// 我们补充一下设定,假设一开始的球数量不是21,是任意的正数
// 如果最终两个人拿的都是偶数,认为无人获胜,平局
// 如果最终两个人拿的都是奇数,认为无人获胜,平局
// rest代表目前剩下多少球
// cur == 0 代表目前是甲行动
// cur == 1 代表目前是乙行动
// first == 0 代表目前甲所选的球数,加起来是偶数
// first == 1 代表目前甲所选的球数,加起来是奇数
// second == 0 代表目前乙所选的球数,加起来是偶数
// second == 1 代表目前乙所选的球数,加起来是奇数
// 返回选完了rest个球,谁会赢,只会返回"甲"、"乙"、"平"
// win1方法,就是彻底暴力的做所有尝试,并且返回最终的胜利者
// 在甲的回合,甲会尝试所有的可能,以保证自己会赢,如果自己怎么都不会赢,那也要尽量平局,如果这个也不行,只能对方赢
// 在乙的回合,乙会尝试所有的可能,以保证自己会赢,如果自己怎么都不会赢,那也要尽量平局,如果这个也不行,只能对方赢
// 算法和数据结构体系学习班,视频39章节,牛羊吃草问题,就是类似这种递归
fn win1(rest: i32, cur: i32, first: i32, second: i32) -> String {if rest == 0 {if first == 0 && second == 1 {return String::from("甲");}if first == 1 && second == 0 {return String::from("乙");}return String::from("平");}if cur == 0 {// 甲行动let mut best_ans = String::from("乙");for pick in 1..=get_min(3, rest) {let mut cur_ans = win1(rest - pick, 1, first ^ (pick & 1), second);if cur_ans == "甲" {best_ans = String::from("甲");break;}if cur_ans == "平" {best_ans = String::from("平");}}return best_ans;} else {// 乙行动let mut best_ans = String::from("甲");for pick in 1..=get_min(3, rest) {let mut cur_ans = win1(rest - pick, 0, first, second ^ (pick & 1));if cur_ans == "乙" {best_ans = String::from("乙");break;}if cur_ans == "平" {best_ans = String::from("平");}}return best_ans;}
}

执行结果如下:


左神java代码

2022-07-15:一开始有21个球,甲和乙轮流拿球,甲先、乙后, 每个人在自己的回合,一定要拿不超过3个球,不能不拿。 最终谁的总球数为偶数,谁赢。 请问谁有必胜策略。 来自微众。人工智能岗。相关推荐

  1. JZOJ 2018.07.15【2018提高组】模拟C组

    目录: 4024. [佛山市选2015]石子游戏 4025. [佛山市选2015]找回密码 2136. [GDKOI2004]汉诺塔 2137. [GDKOI2004]城市统计 4024. [佛山市选 ...

  2. MySQL - 每月涨粉量和当前总粉丝数

    每月涨粉量和当前总粉丝数 题目链接 1. 数据准备 DROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_use ...

  3. 基于Coravel定时任务之计算总页数

    目录 基于Coravel定时任务之计算总页数 1 应用背景 2 对比各家定时库 2.1 TaskScheduler 2.2 Fluent Scheduler 2.3 Quartz.net 2.4 Ha ...

  4. Kaggle常用函数总结 原创 2017年07月03日 21:47:34 标签: kaggle 493 kaggle比赛也参加了好几次,在这里就把自己在做比赛中用到的函数汇总到这,方便自己以后查阅

    Kaggle常用函数总结 原创 2017年07月03日 21:47:34 标签: kaggle / 493 编辑 删除 kaggle比赛也参加了好几次,在这里就把自己在做比赛中用到的函数汇总到这,方便 ...

  5. 超市账单管理------之获取总记录数

    根据以前写过的登录,现在来写一下获取总记录数根据上一个继续编写 1.在IUserInfoDAO中编写 1 //2.获取总记录数 2 public int getTotalCount(); View C ...

  6. Java黑皮书课后题第2章:2.5(金融应用:计算小费)编写一个程序,读入一笔费用与小费利率,计算小费和总钱数

    2.5(金融应用:计算小费)编写一个程序,读入一笔费用与消费利率,计算小费和总钱数 题目 题目概述 举例与运行示例 破题 代码块 方法评价 修改日志 题目 题目概述 2.5(金融应用:计算小费)编写一 ...

  7. sql plus 表的总记录数是多少_直播回顾 | 亿级并发丝毫不虚,TDSQL-SQL引擎是如何炼成的...

    腾讯云数据库国产数据库专题线上技术沙龙正在火热进行中,3月19日唐颢的分享已经结束,没来得及参与的小伙伴不用担心,以下就是直播的视频和文字回顾. 关注"腾讯云数据库"公众号,回复& ...

  8. 如何计算摄影参数:分区基准面高程、相对航高、绝对航高、基线长度、航线间隔、航线数、每条航线的相片数、总相片数。

    目录 01 什么是分区基准面高程? 1.1 那么什么是分区基准面高程呢? 1.2 为什么分区就能减小起伏? 02 什么是相对航高? 03 什么是绝对航高? 04 什么是基线长度(即摄影基线)? 05 ...

  9. 【PowerPoint】如何在PPT幻灯片添加“当前页/总页数”格式的页码

    1.首先,尽量保证目前幻灯片是最终版(后续再修改页数略麻烦). 2.选择"视图"->母版视图栏中的"幻灯片母版" 3.将当前母版和全部子母版的右下角页码& ...

最新文章

  1. MSDynamicsAX2009成本处理与重估(中文)
  2. Android 如何判断CPU是32位还是64位
  3. UA MATH564 概率论 计算至少有一个发生的概率:Boole不等式
  4. 如何遍历维数和各维上限未定的多维数组
  5. web前端开发之div+css教程精华收集二
  6. signature=f0dd2033ed5bb3cdb94f9136381f7750,Lesson 8: Signature Assignment
  7. TCP/IP编程之SO_REUSEADDR和SO_REUSEPORT套接字选项
  8. openSUSE 11.2 文泉中文字体安装
  9. 理解mini-batch、Momentum、RMSpror、Admin优化算法
  10. Atitit 提升战力眼光和组织能力的几大要点 目录 1. 成长金字塔模型 德雷福斯模型 1 2. 提升战略眼光, 3 2.1. 视野与格局 3 2.2. 未来预测 未来发展负责,判断未来趋势, 3
  11. matlab小波包分析,小波分析及小波包分析
  12. 磁环介绍与应用(转)
  13. 1.1Vue安装以及使用(node安装)
  14. Python猜数字项目源代码
  15. java-php-python-ssm基于智能选课系统的设计与实现计算机毕业设计
  16. pytorch载入部分预训练权重
  17. MySQL安装+Navicat11注册机破解
  18. 三星手机和计算机如何连接打印机,三星打印机连接到电脑没反应怎么办
  19. java2ee preview_JavaEE 的基本实现
  20. mysql5.7.12免安装版配置_【MySql学习笔记】免安装版5.7.12 windows配置方法

热门文章

  1. 微信小程序调用时间的三种方法
  2. 离线安装elasticsearch
  3. WKWebView之离线加载以及遇到的问题
  4. AOS加性算子分裂法
  5. 2021轻薄游戏本哪款比较好?
  6. 【Blender教程】在Blender中制作森系少女(上)
  7. 【3.3.7.1的西门子PLC编程软件不再支持XP】
  8. 常戴耳机的危害有多严重?我们一定要选择适合自己的耳机佩戴
  9. iOS:iOS开发系列–打造自己的“美图秀秀”(下)
  10. Python hex()十六进制转换