C 之約瑟夫環

2021-08-18 21:27:15 字數 2003 閱讀 6764

問題原型:

在羅馬人占領喬塔帕特後,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的人自殺。結果兩個人成功脫險,也就誕生了這個演算法。由於本人實力有限,寫出的程式也並未進行優化,可能時間複雜度和空間複雜度上有很多問題,只希望給各位...