Java 数组 约瑟夫问题

白昼怎懂夜的黑 提交于 2019-12-27 06:04:05

最开始是这么写的:

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();

    }
}

测试结果:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!