`
mmdev
  • 浏览: 12916538 次
  • 性别: 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个人围成一个环,然后数到N的是否第N个人退出,从下一个人开始从一数起,在数到N的时候退出,求最后剩下的这个人是谁

    约瑟夫环问题

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

    约瑟夫退圈问题

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

    约瑟夫环(c++实现)

    约瑟夫环问题;有N个人围成一个环,从第一个人开始报数,报到M的人退出环,并且由他的M值来代替原有的M值,要求输出离开环的顺序。本程序可直接运行简单的约瑟夫环问题。

    数据结构-约瑟夫环问题(C/C++)-实验报告/课程设计

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

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

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

    约瑟夫环问题(C 链表)

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

    简单 约瑟夫环 C语言编程实例

    有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报道3的人退出圈子,下一个人从一开始报数,报道3的退出圈子。如此下去,直到留下最后一个人,请按退出顺序输出推出圈子的人的编号,并输出最后一个人的...

    详解约瑟夫环问题及其相关的C语言算法实现

    N个人围成一圈顺序编号,从1号开始按1、2、3……顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。  请按退出顺序输出每个退出人的原序号  算法思想 用数学归纳法递推。 ...

    约瑟夫环圆桌游戏.rar

    n个人排成一圈。从某个人开始,按顺时针方向依次编号。从编号为1的人开始顺时针“一二一”报数,报到2的人退出圈子。这样不断循环下去,圈子里的人将不断减少。由于人的个数是有限的,因此最终会剩下一个人。试问...

    约瑟夫环游戏java

    一群人围成一圈从123报数,如果报到3就退出该圈中,直到最后一个人留下来!

    约瑟夫问题

    n个人围成一圈,顺序编号。从第一个人开始从1到3报数,凡报到3的人退出圈子,编程求解最后留下的人的初始编号。

    c++ 猴子选大王(约瑟夫问题)

    n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。 【输入形式】...

    二叉排序树与退圈问题

    第一个程序:实现将两个二叉排序树合并为一个二叉排序树的算法;...第二个程序:N个人围成一圈,从第一个人开始计数,凡是数到1,2,4,8,也就是2的N次方的退出圈子。编写程序,把这些人退出的顺序输出,要求用链表。

    Josephus problem_Josephusproblem_K._

    约瑟夫环问题描述: 编号为123...n的人一词围成一圈,从第k个人开始报数(从1开始),数到m的人退出。接着下一个人又从1开始报数,数到m的人退出,以此类推。问:剩下的人的编号是多少?

    数据结构课程设计

    无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海中,然后再从他的下一个人数起,数到第9人,再将他扔进大海中,如此循环地进行,直到剩下15个乘客为止。...

    猴子选王(动态实现)

    约瑟夫问题:从有N个围成一圈的猴子中选大王,选举的办法是从第1号猴子开始提取,凡能被m除尽者退出圈外,直到圈内只剩一个猴子为此,此猴为王

    达内 coreJava 习题答案

    6、输出所有的水仙花数,把谓水仙花数是指一个数3位数,其各各位数字立方和等于其本身, 例如: 153 = 1*1*1 + 3*3*3 + 5*5*5 class DafodilNumber{ public static void main(String[] args){ System.out....

Global site tag (gtag.js) - Google Analytics