2-28 约瑟夫环Josephus问题

题目:
古代某法官要判决n个犯人死刑,他有一条荒唐的逻辑,将犯人首尾的相接排成圆圈,然后从第s个人开始数起,每数到第m个犯人,就拉出来处决;然后又数m个,数到的犯人又拉出来处决,依次类推。剩下的最后一人可以豁免。

注意看清楚我的下标,而且书上的图其实是错的!!!

import java.util.Scanner;
//约瑟夫环
public class test5 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int s = scan.nextInt();//开始位置
        int d = scan.nextInt();//每个多少人
        int [] q = new int[n];
        int [] st = new int[n];//st数组表示这个人有没有被删掉,出局

        for(int i = 0; i < n; i ++ ){
            q[i] = i;//人的编号从0开始
        }
        int cnt = 1;//记录d的循环
        int x = 0;//用于判断是否最后一个人
        for (int i = s; i < n; i = (i + 1) % n){
            if(x == n - 1)  break;//如果到最后一个人了,就直接break
            if(cnt != d && st[i] == 0){//这个人没有被删掉且cnt不是d
                cnt ++;
            }
            else if(cnt == d && st[i] == 0){//如果cnt==d并且当前这个人没有被删掉
                st[i] = 1;//那么让他的状态变成1,表示出局了
                System.out.println(i);//输出出局的人
                cnt = 1;//让cnt重置
                x ++;//出局人数加1
            }
        }
        System.out.print("剩下的是");
        for(int i = 0; i < n; i ++){
            if(st[i] != 1){
                System.out.print(i);
            }
        }

    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值