数据结构-约瑟夫游戏的模拟实现(Java)

用循环链表实现:n个乘客同乘一艘船,因为严重超载,加上风高浪大,危险万分,因此船长告诉乘客,只有将部分乘客投入海中,其余人才能幸免于难。无奈,大家只得同意这种办法。于是n个人围成一圈(从A,B,C...分别编号)。从编号为A的人开始,依次报数,数到第distance个人,便把他投入大海中,然后再从他的下一个人数起,数到第distance人,再将他扔到大海中,如此循环地进行,直到剩下k个乘客为止。按顺序依次输出被扔下大海的乘客的编号。


设计一个程序(Java语言实现)求出出列顺序。

输入格式:输入为3个正整数,分别表示n、distance、k,均不超过26

输出格式:输出为一行整数,为出列人的编号。每个整数后一个空格。

第一步,创建n个乘客,n > 0;从start开始计算,0 < start < n;每次数到distance的人出局,0 < distance < n。创建一个ArrayList数组来存放乘客,然后遍历数组输出, 代码如下所示:

 

 if (n <= 0 || start <= 0 || start >= n || distance <= 0 || distance >= n ){
            System.out.println("参数无效!!!请重新输入!!!");
        }else{
            ArrayList<String> list = new ArrayList<>(n);

            System.out.print("编号为:");

        for (int i = 0; i < n; i++) {
            list.add((i + 1) + " ");
        }

  System.out.println(list);

 第二步,创建一个while循环,来进行Josephus环方式计数,start的值等于start加上distance-1在求余得到,为什么要减一呢,是因为从start值计起,代码如下所示:

 while (n > 1){
            start = (start + distance - 1 ) % n;
            System.out.println("删除的编号为:" + list.remove(start) + " " + list);
            n--;
        }

        System.out.println("最后剩下的编号为:" + list.get(0));

完整代码如下所示:

import java.util.ArrayList;

public class Jt {

    public Jt(int n, int start, int distance){

        if (n <= 0 || start <= 0 || start >= n || distance <= 0 || distance >= n ){
            System.out.println("参数无效!!!请重新输入!!!");
        }else{
            ArrayList<String> list = new ArrayList<>(n);

            System.out.print("编号为:");

        for (int i = 0; i < n; i++) {
            list.add((i + 1) + " ");
        }

        System.out.println(list);

        while (n > 1){
            start = (start + distance - 1 ) % n;
            System.out.println("删除的编号为:" + list.remove(start) + " " + list);
            n--;
        }

        System.out.println("最后剩下的编号为:" + list.get(0));
    }
}
    public static void main(String[] args) {
        new Jt(6,3,5);
    }
}

效果图如下图所示:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSuccess

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值