php解決約瑟夫問題
“約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它踢出去…,如此不停的進行下去, 直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求程式設計模擬此過程,輸入m、n, 輸出最後那個大王的編號。
下面列出了三種用PHP來解決此問題的方法:
- 按邏輯依次去除
- 遞迴演算法
- 線性表應用
方法一,按照邏輯依次去除
- function getKingMokey($n, $m)
- {
- $monkey[0] = 0;
- //將1-n只猴子順序編號 入陣列中
-
for
- {
- $monkey[$i] = $i;
- }
- $len = count($monkey);
- //迴圈遍歷陣列元素(猴子編號)
- for($i= 0; $i< $len; $i= $i)
- {
- $num = 0;
- /*
- * 遍歷$monkey陣列,計算陣列中值不為0的元素個數(剩餘猴子的個數)
- * 賦值為$num,並獲取值不為0的元素的元素值
- */
-
foreach
- {
- if($value == 0) continue;
- $num++;
- $values = $value;
- }
- //若只剩一隻猴子 則輸出該猴子編號(陣列元素值) 並退出迴圈
- if($num == 1)
- {
- return$values;
- exit;
- }
-
/*
- * 若剩餘猴子數大於1($num > 1)
- * 繼續程式
- */
- //將第$i只猴子踢出隊伍(相應陣列位置元素值設為0)
- $monkey[$i] = 0;
- /*
- * 獲取下一隻需要踢出隊伍的猴子編號
- * 在$m值範圍內遍歷猴子 並設定$m的計數器
- * 依次取下一猴子編號
- * 若元素值為0,則該位置的猴子已被踢出隊伍
- * 若不為0,繼續獲取下一猴子編號,且計數器加1
- * 若取得的猴子編號大於陣列個數
- * 則從第0只猴子開始遍歷(陣列指標歸零) 步驟同上
- * 直到計數器到達$m值 * 最後獲取的$i值即為下一隻需要踢出隊伍的猴子編號
- */
- //設定計數器
- for($j= 1; $j<= $m; $j++)
- {
- //猴子編號加一,遍歷下一隻猴子
- $i++;
- //若該猴子未被踢出隊伍,獲取下一隻猴子編號
- if($monkey[$i] > 0) continue;
- //若元素值為0,則猴子已被踢出隊伍,進而迴圈取下一隻猴子編號
- if($monkey[$i] == 0)
- {
- //取下一隻猴子編號
- for($k= $i; $k< $len; $k++)
- {
- //值為0,編號加1
- if($monkey[$k] == 0) $i++;
- //否則,編號已取得,退出
- if($monkey[$k] > 0) break;
- }
- }
- //若編號大於猴子個數,則從第0只猴子開始遍歷(陣列指標歸零) 步驟同上
- if($i == $len) $i = 0;
- //同上步驟,獲取下一隻猴子編號
- if($monkey[$i] == 0)
- {
- for($k= $i; $k< $len; $k++)
- {
- if($monkey[$k] == 0) $i++;
- if($monkey[$k] > 0) break;
- }
- }
- }
- }
- }
- //猴子個數
- $n = 10;
- //踢出隊伍的編號間隔值
- $m = 3;
- //呼叫猴王獲取函式
- echo getKingMokey($n, $m)."是猴王";
- function killMonkey($monkeys , $m , $current = 0){
- $number = count($monkeys);
- $num = 1;
- if(count($monkeys) == 1){
- echo$monkeys[0]."成為猴王了";
- return;
- }
- else{
- while($num++ < $m){
- $current++ ;
- $current = $current%$number;
- }
- echo$monkeys[$current]."的猴子被踢掉了<br/>";
- array_splice($monkeys , $current , 1);
- killMonkey($monkeys , $m , $current);
- }
- }
- $monkeys = array(1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9 , 10); //monkeys的編號
- $m = 3; //數到第幾只猴子被踢出
- killMonkey($monkeys , $m);
方法三,線性表應用
- function yuesefu($n,$m) {
-
相關推薦
PHP解決約瑟夫環的問題
//準備好41個人 $people = array(); for($i=0;$i<=40;$i++) { $people[] = $i+1; } /** * @param $people 準備好的陣列 * @param $step 每到第幾個人,會把他殺掉 * @p
php解決約瑟夫環
轉載 https://www.cnblogs.com/china90/p/7367396.html 今天偶遇一道演算法題 “約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它
php解決約瑟夫問題
“約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它踢出去…,如此不停的進行下去, 直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求程式設計模擬此過程,輸入m
php通過迴圈鏈解決約瑟夫環
本想著用php寫些資料結構提升一下,寫到鏈的時候看到約瑟夫環問題,嘗試用迴圈鏈寫了一下 約瑟夫環: 約瑟夫環(約瑟夫問題)是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又
用循環鏈表解決約瑟夫環問題
循環 解決 使用 end head als list output 循環條件 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規
循環鏈表解決約瑟夫問題
lin .cn 尾插 span list str clas amp data 訓練一下尾插法和循環鏈表的使用。 //循環鏈表解決約瑟夫問題 #include <stdio.h> #include <stdlib.h> typedef struc
單循環鏈表 解決約瑟夫環的問題
malloc 表示 重復 printf 約瑟夫 ext std head eof 已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重復下去,直到圓桌周圍的
用迴圈連結串列解決約瑟夫環的問題
約瑟夫環問題簡介 約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出
C語言利用迴圈單鏈表解決約瑟夫問題
Description 編號是1,2,……,n的n個人按照順時針方向圍坐一圈,每個人持有一個密碼(正整數)。一開始任選一個正整數作為報數上限值m,從第一個仍開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他的順時針方向的下一個人開始重新從1報
資料結構--迴圈佇列解決約瑟夫問題(純c)
#ifndef __JOSEPHUS_H__ #define __JOSEPHUS_H__ #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef int QEl
C語言解決約瑟夫環問題 詳細註釋
約瑟夫環演算法是: n 個人圍成一圈,每個人都有一個互不相同的密碼,該密碼是一個整數值,選擇一個人作為起點,然後順時針從 1 到 k(k為起點人手中的密碼值)數數。數到 k 的人退出圈子,然後從下一個人開始繼續從 1 到 j (j為剛退出圈子的人的密碼)數數,數到 j 的人退
連結串列解決約瑟夫環問題
第一次做約瑟夫環問題,歡迎大家來找茬~ 如果做單迴圈連結串列時有點暈了,要畫圖要畫圖要畫圖,重要的事講三遍,因為真的是很好的方法。 #include<stdio.h> #include<stdlib.h> typedef struc
使用連結串列解決約瑟夫環的問題
已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列,問最後一個出環的人的原編號。 用在單鏈表中刪除一個結點的思想
使用連結串列解決約瑟夫環問題
1139 約瑟夫環問題 時間限制:500MS 記憶體限制:65536K 提交次數:157 通過次數:79 題型: 程式設計題 語言: G++;GCC Description 約瑟夫(josephus)環是這樣的:假設有n個小孩圍坐成一個圓圈,並從1開始依次
URAL 1521 War Games 2 樹狀陣列解決約瑟夫環,輸出離隊順序
In accordance with this scheme, the war games are divided into N phases; and N soldiers, successively numbered from 1 to N, are marching round a circle on
C語言解決約瑟夫問題演算法
據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,4
靜態連結串列解決約瑟夫環問題
#include<stdio.h> #define MAXSIZE 100 struct { int cur ; int number; int secret_node; }space[MAXSIZE]; int main(void) { int
(學習java)用java語言構造的迴圈連結串列解決約瑟夫問題
//josephus問題 41個人1-3報數,數到3的自殺,最後剩餘的2個人結點資料 public class Josephus { public static void main(String[] args) { SLineList s = new SLineLis
利用陣列解決約瑟夫環問題
約瑟夫環問題描述:編號為1,2… n的n個人按順時針方向圍坐一圈,每人持有一個密碼(正整數)。一開始任選一個正整數作為報數的上限值m,從第一個人開始按順時針方向自1開始順序報數, 報到m時停止報數,報m的人出列,將他的密碼作為新的m值,從他的順時針方向上的下一個開始重新從1報數,如此下去,直至所有人全部出列為
【年前最後一波裝逼】記一次阿里面試,我是如何用一行程式碼解決約瑟夫環問題的
約瑟夫環問題算是很經典的題了,估計大家都聽說過,然後我就在一次筆試中遇到了,下面我就用 3 種方法來詳細講解一下這道題,最後一種方法學了之後保證讓你可以讓你裝逼。 問題描述:編號為 1-N 的 N 個士兵圍坐在一起形成一個圓圈,從編號為 1 的士兵開始依次報數(1,2,3...這樣依次報),數到 m 的 士