package ds.linkedList;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Josephu {
public static void main(String[] args) {
// 测试
// Scanner input = new Scanner(System.in);
List<Integer> list = fun(2, 2, 3);
System.out.println(list.toString());
}
/**
* 使用数组实现约瑟夫环问题
* @param start 起始叫号位置(开始号)
* @param num 炸弹数
* @param total 总人数
* @return 出局人编号的集合
*/
public static List<Integer> fun(int start, int num, int total){
List<Integer> outList = new ArrayList<>();
/**
* 舍弃数组的 0号位置这样让每个玩家的编号就是数组的下标
* 元素值为 0表示该玩家还未出局 -1表示该玩家已出局
*/
int[] players = new int[total+1];
int i = 0; // 玩家的编号,同时用于数组遍历
int no = 0; // 玩家叫的编号
int remain = total; // 剩余人数,当且晋档只剩一人时游戏结束
// 游戏开始前让下标移动到开始编号的前一位,这样开始编号就报数字1
i = start - 1;
while (remain > 1){
i++;
if (i > total){
i %= total;
}
if (players[i] == 0){ // 玩家未出局
no++; // 叫号
if (no == num){ // 叫到了炸弹数
players[i] = -1;
outList.add(i);
remain--;
no = 0; // 下一个位置重新从1开始叫号
}
}
}
for (int j = 1; j < players.length; j++) {
if (players[j] == 0){
System.out.println(j + "号玩家获得胜利,游戏结束");
break;
}
}
return outList;
}
}
数组实现约瑟夫环问题-Java
最新推荐文章于 2024-07-30 20:50:32 发布