顺序表应用——求解Josephus问题(java)

数据结构 专栏收录该内容
9 篇文章 3 订阅

Josephus问题:古代某法官要判决number个犯人的死刑,他有一条荒唐的法律:让囚犯站成一个圆圈,从第start个人开始数起,每数到第distance个犯人,就拉出去处决,然后再次数distance个人,再次进行处决,,,,直到最后只剩一个人,这个人会被赦免,当number = 5,start = 0,distance = 3时,过程如下:


代码如下:

package list;

public class Josephus {

	public Josephus(int number, int start, int distance) {
		System.out.println("Josephus(" + number + "," + start + "," + distance + ")");
		SeqList<String> list = new SeqList<String>(number);
		
		for (int i = 0; i < number; i++) {
			list.insert((char) ('A' + i) + "");  //这里的技巧要记一下,依次插入A,B,,,
		}
		
		int i = start;
		
		while (list.size() > 1) {  //这个循环也很经典
			i = (i - 1 + distance) % list.size();   //i-1是为了将序号转为数组对应元素
			System.out.print("删除" + list.remove(i).toString() + ",");
			System.out.println(list.toString());
		}
		System.out.println("被赦免者是:" + list.get(0).toString());

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Josephus(5, 0, 2);   //测试例子

	}

}

显示结果如下:


注意上述代码,要和导入SeqList类(顺序表)才可以执行

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

蓝亚之舟

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值