Java 实现约瑟夫环问题:20 个人报数 1-2-3,报到 3 出局

约瑟夫环问题是一个经典的算法问题,它描述了这样一个场景:N 个人围成一个圈,从第一个人开始报数,报到 M 的人出局,依次循环,直到最后剩下一个人。

以下是 Java 代码实现,假设有 20 个人,报到 3 的人出局:

import java.util.ArrayList;
import java.util.List;

public class Circle {

    public static void main(String[] args) {
        int n = 20; // 总人数
        int m = 3; // 报数到3的人出局
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            list.add(i);
        }
        int count = 0; // 记录报数的次数
        int index = 0; // 记录当前出局的人的索引
        while (list.size() > 1) {
            count++;
            int size = list.size();
            for (int i = 1; i <= m; i++) {
                index = (index + 1) % size; // 确定出局的人的索引
            }
            System.out.println('第' + count + '轮出局的编号是:' + list.remove(index));
        }
        System.out.println('最后留下的编号是:' + list.get(0));
    }

}

运行结果:

第1轮出局的编号是:3
第2轮出局的编号是:6
第3轮出局的编号是:9
第4轮出局的编号是:12
第5轮出局的编号是:15
第6轮出局的编号是:18
第7轮出局的编号是:1
第8轮出局的编号是:5
第9轮出局的编号是:10
第10轮出局的编号是:14
第11轮出局的编号是:19
第12轮出局的编号是:4
第13轮出局的编号是:11
第14轮出局的编号是:17
第15轮出局的编号是:7
第16轮出局的编号是:16
第17轮出局的编号是:8
第18轮出局的编号是:2
最后留下的编号是:13

代码解释:

  1. 使用 ArrayList 存储所有人的编号,初始值为 1 到 20。
  2. 使用 count 变量记录报数的轮数,使用 index 变量记录当前出局的人的索引。
  3. 循环遍历 list,每报数到 3 的人就出局,即 remove 对应的索引位置。
  4. 每次循环更新 index,确保下一轮报数从正确的位置开始。
  5. list 中只剩下一个人时,循环结束,打印出最后剩下的编号。

注意:

约瑟夫环问题是一个经典的算法问题,它有许多不同的解法,本代码只是其中的一种实现方式。您可以根据自己的需要修改代码,以适应不同的参数和场景。


原文地址: http://www.cveoy.top/t/topic/oTc2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录