【生存游戏】一组按序排列围成一圈的参赛选手,通过逢3退1游戏机制筛选出最后一个生存者的Java算法
游戏背景
私立希望之峰学园是一座集结了所有领域的超一流高中生的学校。主人公苗木诚,本来只是一名很平凡的日本高中生,却在无意中被选为了“超高校级的幸运”者进入了学园。但是,等待他的却是自称校长的谜之人物“黑白熊”,黑白熊告诉学生们:“一旦进来,就必须一辈子都等在这里才行,只有唯一的幸运者能成功离开这所学园。”
游戏规则
学园共有1000名学生,所有人按顺序围成一圈,从既定的1号开始进行报数。每次报到数字3时,对应的学生将出局从而丧失离开学园的机会,剩下的学生继续从1开始报数,直到剩下最后一个为止。
游戏目标
作为主人公苗木诚的你可以选择开始的序号牌,请问要如何选择,才能在“生存游戏”中存活下来,最终逃离黑白熊的魔掌呢?
逻辑分析
1、 首先要创建一个长度为1000一维数组,并全部赋值1;
2、 创建三个关键变量:count用来报数、remain用来计算剩余人数、索引index用来调用元素值;
3、 在报数过程中遇到值为0的元素,就把元素的值由1更新为0,同时count不变,index增加,继续报数;
4、 当数组中只剩下最后一个人,即remain == 1时,结束循环,打印幸存者的编号。
代码实现
package demo1;public class CaptainChoice {/*** 逢3除外,打印最后留下的编号* * @param args*/public static void main(String[] args) {//假设有1000个人//1、 建立一个初始值全为1的数组int[] students = new int[1000];//System.out.println(students.length);// 对数组赋值for(int i=0;i<students.length;i++) { students[i] = 1; }//2、 创建变量int count = 1;int remain = students.length;int index = 0;//3、 循环体while(true) {// 防止下标越界if(index>students.length-1) {index = index - students.length;}else {// 如果值为0,则跳过该对象if(students[index] == 0) {count--;// index继续+1,count保持不变}// 如果计数为3,则除外该对象else if(count == 3) {students[index] = 0;// 数到3赋值0count = 0;// 报数器归0remain--;// 值为1的数减1}index++;// 下标递增count++;// 报数}//4、 remain == 1的时候,break if(remain == 1) {break;}}//5、 遍历数组找出值为"1"的元素并输出结果for(int i=0;i<students.length;i++) {if(students[i] == 1) {System.out.println("恭喜第"+ (i+1) + "位同学生存下来。");}} }
}
运行结果
要注意的细节
由于这里创建数组设置的数组长度是int型,在Java中int型的长度为4个字节,取值范围为 -2312^{31}231 —— 2312^{31}231 - 1,要注意不要越界报错。
int[] students = new int[1000];
【生存游戏】一组按序排列围成一圈的参赛选手,通过逢3退1游戏机制筛选出最后一个生存者的Java算法相关推荐
- 围成一圈的排列组合问题_分班必考知识点!小学奥数之排列组合问题
点击上方蓝字关注我们 查看更多知识点哦~ SH 研习社 往期精彩回顾 分班必考知识点!小学奥数之流水行船问题 分班必考知识点!小学奥数之牛吃草问题 分班必考知识点!小学奥数之巧算分数 分班必考知识点 ...
- 围成一圈的排列组合问题_行测技巧:巧解环形排列组合
各位同学,排列组合是行测考试中的一个高频考点,也是我们学习的难点.排列组合中有一种特殊的模型---环形排列组合,那么今天小编就带大家一起来探讨一下:如何求解环形排列组合问题. 首先我们需要明确,什么是 ...
- 围成一圈的排列组合问题_约瑟夫问题
约瑟夫问题由来 据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了 ...
- (python)约瑟夫(Josephus)个人围成一圈,并按顺时针依次编号1-n。从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿
约瑟夫(Josephus)环问题 题目:n个人围成一圈,并按顺时针依次编号1-n.从编号为1的人开始,按顺时针方向每隔一 人选出一个,剩下的人重新围成一圈,如此循环直到剩下两人,这剩下的两人就是幸运儿 ...
- 题目: 有 n个人围成一圈,顺序排号。从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位。(模拟)
题目: 有 n个人围成一圈,顺序排号.从第一个人开始报数(从 1到 3报数),凡报到 3的 人退出圈子,问最后留下的是原来第几号的那位. 思路: 题目说是排成一圈,可以看成一个数组的排列.用i从下标为 ...
- ACMNO.38 C语言-报数 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
题目描述 有n人围成一圈,顺序排号. 从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.`在这里插入代码片` 问最后留下的是原来的第几号的那位. 输入 初始人数n 输出 最后一人的初始编号 样 ...
- 10个人围成一圈循环报数,输出最后出圈的人
<程序设计基础-c语言>杨莉 刘鸿翔 ISBN-978-7-03-032903-5 p138 习题5 9.假设有10个人围成一圈,从开始顺序编号.从第一个人开始报数,从1到3,凡是报出3的 ...
- C语言经典例69-有n个人围成一圈报数问题
目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. 2 分析 假设全部人 ...
- 有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数
[问题描述]有n个人围成一圈,按顺序从1到n编号.从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子.如此循环,直到留下最后一个人.问留下来的人的编号. [输入形式] ...
最新文章
- mongodb插入数据获取本次插入的mongodb id
- ICML2020 | PGFS:如何保证生成分子是可合成的?强化学习来帮忙
- 福利丨一门面向所有人的人工智能公开课:MIT 6.S191,深度学习入门
- shell 从1加到100
- 【转载】分布式系统的理解
- 五位专家跟你讲讲为啥Python更适合做AI/机器学习
- Jmeter中JDBC Connection Configuration实现MySQL JDBC Request数据库处理
- maven伺服搭建_nexus搭建maven私服
- 深度强化学习中实验环境-开源平台框架汇总
- 黑马程序员传智播客 python 迭代器学习笔记
- Postgresql创建数据库及用户然后执行初始化脚本
- Ubuntu常用软件推荐,图文详细说明及下载
- Aruba7010 默认密码_紧急提醒:手机上的这个密码必须设,否则钱包很危险!|手机|sim|盗取...
- 工厂食堂3D指纹考勤系统解决方案
- OFN鼠标驱动(三) -- I2C驱动的移植(2)
- pbr发光 unity_Unity PBR—BRDF
- 使用TabLayout+ViewPager+Fragment实现切页展示
- 习题4-5 换硬币 (20 分)
- 你是在独立思考,还是在被洗脑?
- android技术分享方向,android开发分享在Android中计算指南针方位/标题到位置