减治法解决约瑟夫斯问题(JAVA)
生活随笔
收集整理的這篇文章主要介紹了
减治法解决约瑟夫斯问题(JAVA)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
減治法在查找算法中的應用
問題背景:據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人占領喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。首先從一個人開始,越過k-2個人(因為第一個人已經被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。
簡化約瑟夫斯問題:n個人圍成一圈,從第一個開始報數,第m個將被殺掉,最后剩下一個,其余人都將被殺掉。例如n=6,m=5,被殺掉的順序是:5,4,6,2,3,1。
import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("請輸入總人數:");int n = scanner.nextInt();System.out.print("第幾個將被殺死:");int m = scanner.nextInt();yuesefu(n, m);}public static void yuesefu(int n, int m) {// 初始化人數List<Integer> list = new ArrayList<>();for (int i = 1; i <= n; i++) {list.add(i);}//從第K個開始計數int k = 0;while (list.size() >0) {k = k + m;//第m人的索引位置k = k % (list.size()) - 1;// 判斷是否到隊尾if (k < 0) {System.out.println(list.get(list.size()-1));list.remove(list.size() - 1);k = 0;} else {System.out.println(list.get(k));list.remove(k);}}} }
當然約瑟夫斯問題也有數學公式,可以直接得到最后一個存活的人,因為不涉及減治思想,在這里就不詳細講解了。
總結
以上是生活随笔為你收集整理的减治法解决约瑟夫斯问题(JAVA)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache服务器下载、安装、启动、关闭
- 下一篇: 单源最短路径之迪杰斯特拉算法(C语言)