第一种方法
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 --;
}
}
分享到:
相关推荐
约瑟夫问题的基本描述是:N个人围成一个圈,从第一个人开始顺时针方向依次报数,报到M的人将被淘汰(被杀掉),然后从下一个人继续报数,直至只剩下一个为止。题目给出的例子中,N=6,M=5,所以当每个人报数到5时,...
在问题描述中,n个人围成一个圈,每个人都有一个唯一的编号1到n,并且有一个报数上限m。从第一个人开始顺时针报数,报到m的人出列,然后从下一个人继续报数,新的m值变为出列者的密码。这个过程一直持续到所有人都...
约瑟夫问题的基本描述如下:N个人围成一个圈,从第一个人开始顺时针报数,每数到M(M小于N)的那个人将被排除,然后从被排除人的下一个位置继续报数,直到所有人全部出列。问题的目标是找出所有人的出列顺序。 解决...
简单的约瑟夫环代码约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。 分析: (1)由于对于每个...
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。 分析: (1)由于对于每个人只有死和活两种...
约瑟夫环的基本设定是,n个人编号为1到n,围绕成一圈,从第1个人开始按顺时针方向报数,每数到m的人就会被淘汰,下一个人继续从1开始报数,直至只剩最后一个人。这个问题的关键在于找到一个有效的算法来确定每个特定...
设有n个人围成一圈,现从第s个人开始,拨顺时针方向从1开始报数,数到d的人退出圆圈,然后从退出圆圈的下一个人重新开始报数,数到d的人又退出國圈,依此重复下去,直到最后一个人出圈为止。对于任意给定的n, s和d,...
在问题中,M个人按照顺时针方向围成一个圆圈,从某个人开始编号为1,然后从1开始依次报数,每数到N的人就会离开圈子,然后从下一个人继续从1开始报数,直到只剩下最后一个人为止。这个问题的目标是找出最后留在圆圈...
//约瑟夫问题描述:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
该问题的基本设定是:一群囚犯围成一个圈,按照顺时针方向从某个人开始计数,每数到特定数值的人会被剔除出圈,然后从下一个人继续计数,直到只剩下最后一个人为止。这个最后剩下的人将获得自由。在编程领域,约瑟夫...
该问题的基本设定是:有N个人按照顺时针方向围成一个圆圈,从第一个人开始依次报数,每数到M的人会被剔除出圈,然后从下一个人继续开始报数,直至只剩下最后一个人为止。在给定的例子中,N=6,M=5,根据规则,报数5...
1. **问题定义**:假设n个人按顺时针方向站成一个圈,从第一个人开始报数,每数到m的人将被剔除,然后从下一个人继续报数,直至只剩下最后一个人为止。 2. **数据结构选择**:为解决此问题,我们可以使用链表来表示...
该问题描述了一群人围成一个圈,从某个人开始按顺时针方向依次报数,每当数到特定数值的人会被排除出圈,然后从下一个人继续开始报数,直到只剩下最后一个人为止。 在这个实验中,使用了C语言编程来解决约瑟夫环...
在这个问题中,人们站成一个圈,并按照顺时针或逆时针顺序报数,每次数到特定数值的人会被排除出圈,然后从下一个人继续开始报数,直到只剩下最后一个人为止。这个问题的目的是找出最后幸存者的位置。 在教学中,...
这个问题的基本设定是:一个圆圈中的n个人按顺序编号,从第一个人开始报数,数到m的人将被剔除,然后下一轮从下一个人继续报数,直至只剩下最后一个人为止。在MFC(Microsoft Foundation Classes)框架下实现约瑟夫...
这个问题源自古罗马历史学家约瑟夫斯的一个故事,讲述了一群人围成一个圈,并按照一定的规则淘汰成员,直到最后剩下一个人为止。在计算机科学中,约瑟夫问题被抽象为一种特殊的链表应用——环形链表的应用场景。 ##...
约瑟夫环问题,用循环链表实现,最后输出胜利者
这个问题描述如下:N个人按照顺时针方向围成一个圈,从第一个人开始依次报数,报到M的人将退出圈子,然后从下一个人继续开始报数,直到只剩下最后一个人为止。题目要求我们找出所有离开圈子的顺序。 在C++中实现...
每次数到特定数字的人会被排除出圈,接着从下一个人重新开始报数,直到只剩最后一个人为止。这个最后剩下的人被称为“幸存者”。约瑟夫环问题就是求解这个“幸存者”的位置。 二、算法实现 1. 链表实现:利用链表...