`
mmdev
  • 浏览: 13428985 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

约瑟夫环问题-所有人围成一圈,数到3的人退出,最后留下人的位置?

 
阅读更多

第一种方法

public class Count3Quit{
public static void main(String []args){
//定义一个数组用来当做500个人.并且初始化为true表示都在圈内
boolean arr[] =new boolean[500];
for(int i=0; i<arr.length; i++){
arr[i]=true;
}
//定义一个总人数
int count=arr.length;
//定义一个索引位置,表示当前在那个位置
int index=0;
//计数器,数到3退出
int countNum=0;
//如果只剩下最后一个人就退出循环
while(count>1){

if(arr[index]==true){ //如果当前的这个人在圈内就开始数数

countNum++;

if(countNum==3){

countNum=0; // 如果数到3了就要把计数器归0

arr[index]=false; //表示这个人已经退出

count--; //总人数减去一个

}
}

index++;

if(index==arr.length){
index=0;
}
}
//找到最后一个在圈子内的人的下标位置
for(int i=0 ;i<arr.length; i++){
if(arr[i]==true){
System.out.println("最后剩下的一个人在第"+(i+1)+"个位置");
}
}
}
}

第二种方法(面向对象的思想)

public class Count3Quit2 {
public static void main(String[] args) {
KidCircle kc = new KidCircle(500);
int countNum = 0;
Kid k = kc.first;
while(kc.count > 1) {
countNum ++;
if(countNum == 3) {
countNum = 0;
kc.delete(k);
}
k = k.right;
}

System.out.println(kc.first.id);
}
}

class Kid {
int id;
Kid left;
Kid right;
}

class KidCircle {
int count = 0;
Kid first, last;

KidCircle(int n) {
for(int i=0; i<n; i++) {
add();
}
}

void add() {
Kid k = new Kid();
k.id = count;
if(count <= 0) {
first = k;
last = k;
k.left = k;
k.right = k;
} else {
last.right = k;
k.left = last;
k.right = first;
first.left = k;
last = k;
}
count ++;
}

void delete(Kid k) {
if(count <= 0) {
return;
} else if (count == 1) {
first = last = null;
} else {
k.left.right = k.right;
k.right.left = k.left;

if(k == first) {
first = k.right;
} else if( k == last) {
last = k.left;
}
}
count --;
}
}

分享到:
评论

相关推荐

    约瑟夫环问题-循环链表.cpp

    设有n个人围成一圈,现从第s个人开始,拨顺时针方向从1开始报数,数到d的人退出圆圈,然后从退出圆圈的下一个人重新开始报数,数到d的人又退出國圈,依此重复下去,直到最后一个人出圈为止。对于任意给定的n, s和d,...

    约瑟夫算法(M个人围成一个环,数到N退出,求最后一个人)

    在问题中,M个人按照顺时针方向围成一个圆圈,从某个人开始编号为1,然后从1开始依次报数,每数到N的人就会离开圈子,然后从下一个人继续从1开始报数,直到只剩下最后一个人为止。这个问题的目标是找出最后留在圆圈...

    数据结构实验报告--约瑟夫环

    该问题的设定是有一群人围成一个圈,按照一定的规则报数,报到特定数字的人会退出圈子,直到所有人都退出。在这个实验报告中,约瑟夫环问题通过C语言进行了实现。 首先,实验的【数据结构设计】部分采用了不带头...

    约瑟夫环(c++实现)

    这个问题描述如下:N个人按照顺时针方向围成一个圈,从第一个人开始依次报数,报到M的人将退出圈子,然后从下一个人继续开始报数,直到只剩下最后一个人为止。题目要求我们找出所有离开圈子的顺序。 在C++中实现...

    matlab解决约瑟夫问题

    约瑟夫问题源自一个经典的数学问题,该问题描述了这样的场景:N个人围成一个圈,并按照某种规则依次淘汰,直到只剩下一个人为止。具体规则是:从某人开始报数,数到指定数字(M)的人将被淘汰出局,然后从下一个人...

    约瑟夫环问题

    原题: 用户输入M,N值,N个人围成一个环,从0号人开始数,数到M,那个人就退出游戏,直到最后一个人 求最后一个剩下的人是几号? 问题描述  设编号为1-n的n(n&gt;0)个人按顺时针方向围成一圈.首先第1个人从1开始...

    约瑟夫环问题,儿童数数游戏

    在这个游戏中,孩子们围成一个圈,然后按照一定的规则进行数数。每当数到某个特定数字(例如,3)时,数到该数字的孩子就会退出游戏。接着,游戏继续进行,直到只剩下最后一个孩子为止。这个最后剩下的孩子就是游戏...

    约瑟夫环是一个数学的应用问题.doc

    在问题描述中,有n个人围成一个圈,从编号为k的人开始报数,数到m的人会退出圈子,然后从下一个人重新开始报数,直到所有人都退出圈子。例如,当n=9,k=1,m=5时,出局顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。 解决...

    约瑟夫退圈问题

    N个人围成一圈,从第一个人开始按顺序报数并编号1,2,3,……N,然后开始从第一个人转圈报数,凡是报到3的退出圈子。则剩下的最后一个人编号是多少。 定义一个类,然后在类前定义一个结构体  2、在类中定义一个链表...

    双向约瑟夫问题(顺时针再逆时针)

    在传统的约瑟夫问题中,n个人围成一个圆圈,按顺时针方向数到第m个人,此人退出圆圈,然后从下一个人开始继续顺时针数m个人,直到剩下最后一个人。而双向约瑟夫问题(顺时针再逆时针)则在每个被数到的人退出圆圈后...

    约瑟夫环-数据结构.doc

    在该问题中,n个人围成一个圈,按照顺时针方向自1开始报数,报到m的人退出圈子,然后从下一个人继续报数,直至所有人退出。最终的目标是找出所有人的退出顺序。 **基本算法分析:** 1. **数据结构选择:**解决...

    约瑟夫环问题的源代码(数据结构)

    数据结构中的约瑟夫环问题,用c++实现的。有n个人围成一圈,从第k个人开始报数,报到m的人退出,下一个人重新开始报数。

    数据结构实验约瑟夫环问题实验报告

    实验目的:设有编号为 1,2,...,n 的 n(n&gt;0)个人围成一个圈,每个人持有一个密码 m,从第 1 个人开始报数,报到 m 时停止报数,报m 的人出圈,再从他的下一个人起重新报数,报到 m 时停止报数,报 m 的出圈,........

    约瑟夫环代码 c语言约瑟夫

    ### 约瑟夫环问题及其...该程序首先创建了一个循环单向链表来模拟围成一圈的人,然后通过循环遍历链表的方式模拟了游戏的进行,直到所有参与者都出列为止。这种基于链表的实现方式不仅简洁明了,而且便于理解和扩展。

    基于mfc的约瑟夫环模拟器

    在这个问题中,人们围成一个圈,从某个人开始按顺序报数,每次数到特定数字的人会被排除出圈,然后从下一个人继续开始报数,直到只剩下最后一个人为止。在编程中,我们通常使用链表数据结构来模拟这个过程,并通过...

    约瑟夫出圈问题

    - **初始状态**:30人围成一圈,其中前15人为教徒,后15人为非教徒。 ##### 2.2 解决方案设计 为了解决这个问题,可以采用链表的数据结构来模拟整个过程。通过遍历链表并根据规则移除对应的人,最终得到的结果即为...

    数据结构约瑟夫环实验报告

    约瑟夫环问题的基本设定是:n个人围成一个圈,每个人都有一个从1到n的编号,从某个人开始按顺时针方向报数,报到m的人退出圈子,然后从下一个人继续报数,直到所有人都退出为止。在此实验中,要求设计一个程序,能够...

    约瑟夫环C语言实现代码

    问题描述如下:n个人围成一个圈,从某个人开始报数(从1到m报数),凡数到m的人退出圈子,问最后剩下的那个人是最初第几个。这个问题可以用多种数据结构和算法来解决,其中一种常用的方法是使用循环数组或链表来模拟...

    约瑟夫环问题(C 链表)

    已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

Global site tag (gtag.js) - Google Analytics