原题
7-3 约瑟夫环问题
分数 15
作者 abc618382
单位 河北科技大学
约瑟夫环问题
约瑟夫环是一个数学的应用问题:已知n个人(以编号a,b,c...分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入格式:
固定为2行,第一行为m,第二行为n个人的名称列表,用英文字母代表,元素直接使用英文逗号 , 分开
输出格式:
一行,为出列元素序列,元素之间使用英文逗号 , 分开【注意:末尾元素后没有逗号】
输入样例:
在这里给出一组输入。例如:
3
a,b,c,d,e,f,g
输出样例:
在这里给出相应的输出。例如:
c,f,b,g,e,a,d
答案
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取输入的n
int n = sc.nextInt();
sc.nextLine(); // 消耗掉nextInt后的换行符以保证sc.nextLine()读入桌子上的人而不是一个换行符
// 创建一个列表来存储桌子上的人
List<String> deskList = new ArrayList<>();
// 读取输入的桌子上的人,并将他们添加到列表中
String deskString = sc.nextLine();
String[] deskStrings = deskString.split(",");
for (String people : deskStrings) {
deskList.add(people);
}
// 初始化指针i
int i = n - 1;
// 开始约瑟夫环游戏,直到桌子上没有人
while (!deskList.isEmpty()) {
i = i % deskList.size(); // 计算i的值,确保它在列表范围内
// 如果桌子上的人不止一个,输出当前位置的人并将其移除
if (deskList.size() != 1) {
System.out.print(deskList.get(i) + ",");
deskList.remove(i);
}
// 如果桌子上只剩一个人,输出该人并将其移除
else {
System.out.print(deskList.get(i));
deskList.remove(i);
}
// 如果桌子上还有人,更新i的值
// 该判断可以排除除数为0的错误
if (!deskList.isEmpty()) {
i = (i + n - 1) % deskList.size();
}
//因为少了一个人所以 i = (i + n - 1) % deskList.size()要-1;
}
// 关闭Scanner
sc.close();
}
}