1. 程式人生 > >Josephu(約瑟夫)問題(java版本)

Josephu(約瑟夫)問題(java版本)

宣告:整理的學習版本,並非本人成果。

Josephu問題為:設編號為1,2,……,n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m的那個人出列,他的下一位又從1開始報數,數到m的那個人又出列,以此類推,直到所有人出列為止,由此產生一個出隊編號的序列。
提示:用一個不帶頭結點的迴圈連結串列來處理Josephu問題,先構成一個有n個結點的單迴圈連結串列,,然後由k結點起從1開始計數,計到m時,對應結點從連結串列中刪除,然後再從被刪除結點的下一個結點又從1開始計數,直到最後一個結點從連結串列中刪除,演算法結束。

/*
 * 功能:Josephu問題(丟手帕問題)
*/
package com.zuola; public class Demo { public static void main(String[] args) { // TODO Auto-generated method stub CycLink cyclink=new CycLink(); cyclink.setLen(5); cyclink.createLink(); cyclink.setK(2); cyclink.setM(2); cyclink.show(); cyclink.play(); } } class Child { int
no; Child nextChild; public Child(int no) { //給一個編號 this.no=no; } } //環形連結串列 class CycLink { //先定義一個指向連結串列第一個小孩的引用 //指向第一個小孩的引用不能動 Child firstChild=null; Child temp=null;//當前指標指向的小孩 int len=0;//表示共有幾個小孩 int k=0;//從哪個孩子開始數數 int m=0;//每次數多少下 //設定m public
void setM(int m) { this.m=m; } //設定連結串列的大小 public void setLen(int len) { this.len=len; } //從第幾個人開始數數 public void setK(int k) { this.k=k; } //開始play public void play() { Child temp=this.firstChild; //1.先找到開始數數的人 for (int i=1;i<k;i++) { temp=temp.nextChild; } //2.數m下 while(this.len!=1){ for(int j=1;j<m;j++) { temp=temp.nextChild; } //找到要出圈的前一個小孩 Child temp2=temp; while(temp2.nextChild!=temp) { temp2=temp2.nextChild; } //3.將數到m的小孩退出圈 temp2.nextChild=temp.nextChild; //讓temp指向下一個數數的小孩 temp=temp.nextChild; this.len--; } //最後一個小孩 System.out.println("最後出圈:"+temp.no); } //初始化環形連結串列 public void createLink() { for(int i=1;i<=len;i++) { if(i==1) { //建立第一個小孩 Child ch=new Child(i); this.firstChild=ch; this.temp=ch; }else { //建立最後一個小孩 if(i==len){ Child ch=new Child(i); temp.nextChild=ch; temp=ch; temp.nextChild=this.firstChild; }else{ //繼續建立小孩 Child ch=new Child(i); temp.nextChild=ch; temp=ch; } } } } //列印該環形連結串列 public void show() { //定義一個跑龍套 Child temp=this.firstChild; do{ System.out.print(temp.no+" "); temp=temp.nextChild; }while(temp!=this.firstChild); } }

相關推薦

Josephu問題java版本

宣告:整理的學習版本,並非本人成果。 Josephu問題為:設編號為1,2,……,n的n個人圍坐一圈,約定編號為k(1<=k<=n)的人從1開始報數,數到m的那個人出列,他的下一位又從1開始報數,數到m的那個人又出列,以此類推,直到所有人出列為

環問題 java程式碼實現高效率

<pre name="code" class="java">//約瑟夫問題 package com.test; public class test { public static void main(String[] args) { CycLink cycLink= n

報數遊戲java實現

開端 公司組織考試,一拿到考題,就是演算法裡說的約瑟夫環,仔細想想 以前老師將的都忘了,還是自己琢磨把~ package basi

2746 問題單向循環鏈表解法

刪除 != ast pen 過程 turn style -c log 題目鏈接:http://bailian.openjudge.cn/practice/2746描述約瑟夫問題:有n只猴子,按順時針方向圍成一圈選大王(編號從1到n),從第1號開始報數,一直數到m,數到m的猴

F - System Overload環問題

point ould ica cat random ppi out eterm img Description Recently you must have experienced that when too many people use the BBS simultan

G - And Then There Was One

then star names rule this ret zeros datasets cell Description Let’s play a stone removing game. Initially, n stones are arranged on a ci

單向循環鏈表

data 單向 struct hit ++ main 指針 printf [] #include<stdio.h>#include<stdlib.h>#define N 10typedef struct node{ int data; st

NOIP2018模擬賽 遊戲數學 不會搞2018 10 11 T1

簡述題意: 演算法:數學 難度:NOIP 簡述題解: 大佬題解 程式碼如下: #include <iostream> #include <cstdio> #include <algorithm> #define ll long l

線性寫法

1073 約瑟夫環 1 秒   131,072 KB   0 分   基礎題 N個人坐成一個圓環(編號為1 - N),從第1個人開始報數,數到K的人出列,後面的人重新從1開始報數。問最後剩下的人的編號。 例如:N

【Luogu1996】問題模擬,解法彙總

problem n個人,每次數到m的人出隊 輸出出隊順序 n<=100 solution1 模擬:每次列舉第m個人出隊 O(n,m) #include<iostream> using namespace std;

And Then There Was One 動態規劃

UVA - 1394 原題目連結 題目描述: Let’s play a stone removing game. Initially, n stones are arranged on a circle and numbered 1, . . . , n clock

POJ - 3517 And Then There Was One 環變式

題目大意:       n個人,從第m個人開始報數,報到k的人出局,問最後剩餘的人是第幾號 題解:      本題和經典的約瑟夫環問題相比,就是從第m個人開始報數了,經典的是從第1個開始   &

HDU - 5643 King's Game 環變式

題目大意:        n個人圍成一個環坐著,編號從1到n,從第一個人開始報數,第一輪報到1的人出列;第二輪報到2的人出列......第n-1輪報到n-1的人出列,問最後剩下的人的編號是多少 題解:  ①首先本題的資料

使用C語言單向迴圈連結串列來解決

題目描述 編號為1,2,…,n的n個人按順時針方向圍坐在一張圓桌周圍,每人持有一個密碼(正整數)。一 開始任選一個正整數m作為報數上限值,從第一個人開始按順時針方向自1開始報數,報到m時停止報數,報m的那 個人出列,將他的密碼作為新的m值,從他順時針方向的下一個人開始重新從1報數,

猴子選大王問題

資料結構與演算法之約瑟夫環。 與其枯燥的講解約瑟夫環,倒不如用約瑟夫環來解決一個有趣的問題。 猴子選大王問題:     現在有N個猴子需要選取一個猴王,這N個猴子手拉手圍成一個圈,旁邊有一位德高望重的老猴,先將這一圈猴按順時針方向編號1,2.......N,然後

Gym 101864 A Criminal

題意:t個樣例,m個人圍成一圈,m的範圍在l到n,一二報數,報數到二的人離開,直至剩下一個人,現在求編號為x的人留下的概率 思路:約瑟夫環有遞推公式,f[1] = 0;當一個人的時候,出隊人員編號為0,這裡編號從0開始,題目是從1開始,f[n] = (f[n-1

問題基於NOIP初賽題的改編

【問題描述】 YJC 很喜歡玩遊戲,今天他決定和朋友們玩約瑟夫遊戲。 約瑟夫遊戲的規則是這樣的:n 個人圍成一圈,從1 號開始依次報數,當報到m 時, 報1、2、...、m-1 的人出局,下一個人接著從1 開始報,保證(n-1)是(m-1)的倍數。最後剩的一個人獲勝。

資料結構--迴圈佇列解決問題純c

#ifndef __JOSEPHUS_H__ #define __JOSEPHUS_H__ #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef int QEl

連結串列法,公式法

約瑟夫環作為一個數學問題,它的程式碼實現方式有很多,比如迴圈連結串列,公式解決或者動態規劃,之前參考資料也有用遞迴解決的。Anyway,這些都是解決約瑟夫環問題很有效的方法。這裡總結兩種方法,迴圈連結串列法和公式法。 首先是迴圈連結串列法,它的原理很簡單,也很容

51Nod1073 遞推公式

#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #