您的位置:首页 > 其它

所有人围成一个圈,数到3的人就退出,问最后留下的那个人的位置在那里

2013-10-16 22:18 399 查看


约瑟夫环问题-所有人围成一个圈,数到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 --;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐