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> #