数组实现约瑟夫环问题-Java

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;
    }
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值