瑟夫环问题:
问题描述:
一群人围在一起,由第一个人从一开始报数,直到有人报到三,报到三的人出局,剩下的人继续从一开始报数报到三的人出局,以此循环往复直到这一圈人只剩下一个人游戏结束。
问题分析:
1.要完成这个游戏首先要所有人围成一圈,这样才可以按照出局规则一直循环下去这个,我们可以定义一个ArrayList集合用来存储游戏中的所有玩家,再定义一个变量index来表示当前报数玩家在圈中的位置。用循环实现index从0开始一直到最后一个下标。当index到最后一个下标的时候就让index等于0以此来模拟一群人围在一起的环。
2.实现了一个环结构后就可以在其中编写规则了首先是从一开始报数,首先定义一个变量number然后,让number每一次循环都自增一。直到number==3这时就应该移出ArrayList中当前下标(index)的元素
并且让number等于一(因为移出ArrayList当前元素会使得之后的元素向前移动填补当前空位,所以下一次的报数还应该从当前下标开始)然后continue跳出本次循环并且从跳出循环前的下标开始下一次的报数。
3.游戏总有结束的时候,所以这个循环也应该有个终止条件。这个循环的终止条件很简单,当ArrayList.size()为一的时候就可以终止了。换言之当ArrayList.size()>1是可以继续循环的条件。
代码实现:
import java.util.ArrayList;
import java.util.List;
public class LianXi01 {
public static void main(String[]args){
int index = 0;
int number = 1;
List<Integer> list = new ArrayList();
//这个循环用来给ArrayList中的元素赋值为了方便辨认获胜者是哪一位所以从1开始
for(int i=1;i<=15;i++){
list.add(i);
}
System.out.print("出局的顺序:");
//在这里游戏正式开始
while(list.size()>1){
//这个用来判断当前下标是否超出集合最大下标(也就是说是否该重新从第一个人开始报数)
if(index>list.size()-1){
index=0;
}
//这个用来判断报的数是否到达3
if(number==3){
System.out.print(list.get(index)+" ");
list.remove(index);
number=1;
continue;
}
number++;
index++;
}
//因为集合中只剩下了一个人所以0下标就是剩下的那个人,直接输出即可
System.out.print("游戏结束第"+list.get(0)+"人胜利");
}
}
运行结果:出局的顺序:3 6 9 12 15 4 8 13 2 10 1 11 7 14 游戏结束第5人胜利