問題原型:
在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第k個人。接著,再越過k-1個人,並殺掉第k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。
數學模型:
約瑟夫環(約瑟夫問題):已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。
(一)陣列解決
#include "stdio.h"
int main()
; //初始化每乙個都為0
int num = 0;
int k = 1;
int i = 0;
for (i = 0; i
(二)鍊錶解決
* 結構體和函式宣告 */
typedef struct _node_t
node_t;
/* 功能函式實現 */
/* * name: node_t_create
* params:
* n [in] 輸入要構造的鍊錶的個數
* return:
* 返回構造成功的環形單向鍊錶指標
* notes:
* 構造節點數量為 n 的環形單向鍊錶
* */
node_t * node_t_create(int n,int key)
p_node->n_num = n;
p_node->passwd = key[n];
p_node->next = p_ret;
} return p_ret;
}
/* * name: main
* params:
* none
* return:
* int
* notes:
* main function
*/
int main()
/* 輸出第 m 個節點的值 */
printf("%d/n", p_iter->next->n_num);
m = p_iter->next->passwd;//儲存將要刪除的節點key值,作為下一次的密碼用
/* 從鍊錶中刪除第 m 個節點 */
p_iter->next = p_iter->next->next;
p_iter = p_iter->next;
while (p_iter != p_iter->next)
/* 輸出第 m 個節點的值 */
printf("%d/n", p_iter->next->n_num);
m = p_iter->next->passwd;
/* 從鍊錶中刪除第 m 個節點 */
p_iter->next = p_iter->next->next;
p_iter = p_iter->next;
} printf("%d/n", p_iter->n_num);
/* 釋放申請的空間 */
free(p_list);
return 0;
}
C 之約瑟夫環
0,1,2,3,n 1這n個數排成乙個圈,從數字0開始,每次在圓圈裡面剔除第m個數字。求出這個圓圈最後乙個數字。乙個是使用鍊錶來模擬這個過程 使用公式推導 鍊錶模擬 int lastremaining solution int n,int m else return peoples.begin 公式...
PHP坑之 約瑟夫環
約瑟夫環 問題 一群猴子排成一圈,按1,2,n依次編號。然後從第一只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,再把它踢出去 如此不停的進行下去,直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求 輸入m,n,輸出最後的那個大王的編號。遞迴演算法 function killmo...
經典演算法之約瑟夫環問題
前幾天看到乙個程式設計題,約瑟夫環問題。問題的由來是乙個猶太故事,41乙個人被困,有39個人想要自殺,想活下去的兩個人就出主意說,大家圍成乙個環,報到3的人自殺。結果兩個人成功脫險,也就誕生了這個演算法。由於本人實力有限,寫出的程式也並未進行優化,可能時間複雜度和空間複雜度上有很多問題,只希望給各位...