约瑟夫问题(java实现)
生活随笔
收集整理的這篇文章主要介紹了
约瑟夫问题(java实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
方法一、自定義的鏈表實現
package com.code.yuesefu;public class YueSeFuList {public static void main(String[] args) {int count = 41;//申請一個指定長度的鏈表Node n = YueSeFuList.createNodes(count);for(int i=0;i<count;i++){Node second = n.next;//第2個n = n.next.next;//第3個System.out.println(n.item);//返回第3個 second.next = n.next;//讓第2個的next指向第4個n = n.next;//讓第4個作為第1個 }}public static Node createNodes(int count){Node next = null;Node head = new Node<String>("head",null);Node last = head;//剛開始頭和尾都是同一個元素//新元素插入尾部,新元素作為尾for(int i=1; i<=count; i++){next = new Node<String>("num "+i,null);last.next = next;last = next;}last.next = head.next;//最后把尾部元素和插入的第一個元素連起來head = head.next;//把剛開始的那個head去掉,讓插入的第一個元素作為head,返回出去return head;}private static class Node<E>{E item;Node<E> next;//Node<E> prev; Node( E element, Node<E> next) {this.item = element;this.next = next;// this.prev = prev; }}} 方法2、使用LinkedList實現
package com.code.yuesefu;import java.util.LinkedList; import java.util.List;/** 約瑟夫問題* 41個人,圍成圈,從第一個人開始從1報數,當碰到3時,那個人出局。然后后面的人再從1開始報數,直到全部出局
據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人占領喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。首先從一個人開始,越過k-2個人(因為第一個人已經被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。* */ public class YueSeFu {public static void main(String[] args) {List list = new LinkedList<String>();//初始化鏈表for(int i=0;i<41;i++){int a = i+1;list.add("p"+a);}int i = 0;while(list.size() > 2){i = i+2;//每次移動2位,如果位置超出鏈表長度,就從頭再來if(i>list.size()-1){i = i-list.size();}System.out.println((String)list.remove(i));}
//最后的兩個幸存者System.out.println(list.get(0));System.out.println(list.get(1));}}
package com.code.yuesefu;public class YueSeFuList {public static void main(String[] args) {int count = 41;//申請一個指定長度的鏈表Node n = YueSeFuList.createNodes(count);for(int i=0;i<count;i++){Node second = n.next;//第2個n = n.next.next;//第3個System.out.println(n.item);//返回第3個 second.next = n.next;//讓第2個的next指向第4個n = n.next;//讓第4個作為第1個 }}public static Node createNodes(int count){Node next = null;Node head = new Node<String>("head",null);Node last = head;//剛開始頭和尾都是同一個元素//新元素插入尾部,新元素作為尾for(int i=1; i<=count; i++){next = new Node<String>("num "+i,null);last.next = next;last = next;}last.next = head.next;//最后把尾部元素和插入的第一個元素連起來head = head.next;//把剛開始的那個head去掉,讓插入的第一個元素作為head,返回出去return head;}private static class Node<E>{E item;Node<E> next;//Node<E> prev; Node( E element, Node<E> next) {this.item = element;this.next = next;// this.prev = prev; }}} 方法2、使用LinkedList實現
package com.code.yuesefu;import java.util.LinkedList; import java.util.List;/** 約瑟夫問題* 41個人,圍成圈,從第一個人開始從1報數,當碰到3時,那個人出局。然后后面的人再從1開始報數,直到全部出局
據說著名猶太歷史學家 Josephus有過以下的故事:在羅馬人占領喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然后再由下一個重新報數,直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從。首先從一個人開始,越過k-2個人(因為第一個人已經被越過),并殺掉第k個人。接著,再越過k-1個人,并殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下一個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什么地方才能避免被處決?Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。* */ public class YueSeFu {public static void main(String[] args) {List list = new LinkedList<String>();//初始化鏈表for(int i=0;i<41;i++){int a = i+1;list.add("p"+a);}int i = 0;while(list.size() > 2){i = i+2;//每次移動2位,如果位置超出鏈表長度,就從頭再來if(i>list.size()-1){i = i-list.size();}System.out.println((String)list.remove(i));}
//最后的兩個幸存者System.out.println(list.get(0));System.out.println(list.get(1));}}
?
轉載于:https://www.cnblogs.com/wwzyy/p/6135264.html
總結
以上是生活随笔為你收集整理的约瑟夫问题(java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 14 新加入的五笔输入法可以提升
- 下一篇: 推荐文章:机器学习:“一文读懂机器学习,