最开始是这么写的:
int[] list = new int[10];//总人数
int x = 10;//记录数组中还有几个人活人
//建立输入流确定那个犯人死亡
Scanner scan = new Scanner(System.in);
//给犯人编号
for (int i = 0; i < list.length; i++) {
list[i] = i + 1;
}
//输入犯人列表
for (int i = 0; i < list.length; i++) {
System.out.print(list[i]+" ");
}
//当仅有一人活着的时候游戏结束
while (x != 1) {
System.out.println("请输入想要打死的犯人");
//每次输入先要打死的犯人
int n = scan.nextInt();
if (list[n-1]==0){
//如果犯人已经被打死,那么重新输入
System.out.println("该犯人已经被打死,请重新输入");
continue;
}
list[n-1] = 0;
x--;//人数减少1
if (x==1){
//如果只剩下最后一个人
System.out.println("最后活下来的人是:");
}
//输入还有哪些序号的人还活着
for (int i = 0; i < list.length; i++) {
if (list[i] == 0) {
//如果值为0那么犯人已经死亡不输出
continue;
}else{
//输出还有那些人还活着
System.out.print(list[i]+" ");
}
}
}
一个另类的问题,每次打死你想打死的人,知道最后一个人为止。
它和约瑟夫问题的区别就在于约瑟夫每次都是杀死相应位置的人,之后由下一个人重新报数
那么我们就需要稍加修改。
首先是每次死的人为止都是固定的:
然后是一些记录数据:
然后给犯人编号:
之后开始杀死犯人:
全部代码如下:
public class demo { public static void main(String[] args) { int[] list = new int[10];//总人数 int a = 0;//记录当前到第几个人了 int x = 10;//记录数组中还有几个人活人 int y = 0;//记录报数报到几了 //建立输入流确定第几号犯人死亡 Scanner scan = new Scanner(System.in); System.out.println("请确定第几号的犯人死亡:"); int n = scan.nextInt(); //给犯人编号 for (int i = 0; i < list.length; i++) { list[i] = i + 1; } //输出当前犯人 System.out.println("犯人列表有:"); for (int i = 0; i < list.length; i++) { System.out.print(list[i] + " "); } System.out.println(); System.out.println("开始杀死犯人"); //当仅有n-1人活着的时候游戏结束 while (x != (n - 1)) { //当检测到这个人活着的时候报数+1 if (list[a] > 0) { y++; } a++; //如果超过最大人数,直接跳到第一个 if (a >= list.length) { a = 0; } //如果报数的这个人刚好活着 if (y == (n - 1) && list[a] > 0) { //计数器置零 y = 0; //输出死亡人数 System.out.print(list[a] + "死亡 "); list[a] = 0;//犯人死亡 x--;//人数减少1 } } System.out.println(); if (x == 2) { System.out.println("最后活下来的人是:"); } //输出还有哪些序号的人还活着 for (int i = 0; i < list.length; i++) { if (list[i] == 0) { //如果值为0那么犯人已经死亡不输出 continue; } else { //输出还有那些人还活着 System.out.print(list[i] + " "); } } System.out.println(); } }
测试结果:
来源:CSDN
作者:曲水流觞笑醉尘
链接:https://blog.csdn.net/qq_42525761/article/details/103646391