經典演算法問題之約瑟夫問題

2021-06-05 11:11:46 字數 1177 閱讀 1517

/*

據說著名猶太歷史學家 josephus有過以下的故事:

在羅馬人占領喬塔帕特後,

39 個猶太人與josephus及他的朋友躲到乙個洞中,

39個猶太人決定寧願死也不要被敵人抓到,

於是決定了乙個自殺方式,41個人排成乙個圓圈,

由第1個人開始報數,

每報數到第3人該人就必須自殺,

然後再由下乙個重新報數,直到所有人都自殺身亡為止。

然而josephus 和他的朋友並不想遵從,

josephus要他的朋友先假裝遵從,

他將朋友與自己安排在第16個與第31個位置,

於是逃過了這場死亡遊戲。

這裡我們用迴圈鍊錶來實現 */

#include

#include

#include

struct node;//宣告節點

typedef struct node *ptrtonode;

typedef ptrtonode position;

typedef ptrtonode head;

typedef ptrtonode list;

//節點定義

struct node;

/*建立鍊錶*/

list createlink(int num)

p->next = head;//讓最後乙個節點的指標指回頭結點

return head;//將頭節點返回}

/*建立約瑟夫環,num表示人數,n表示每n個刪掉乙個*/

void jose(position p,int num,int n)

q = p->next;//將需要刪除的節點暫時儲存在q中,此時p表示要刪除節點的上乙個節點

//將p->next(要刪除的節點)從鍊錶中刪除

p->next = q->next;

p = p->next;

printf("第%3d個出圈的是:%3d,name is %s\n",i,q->no,q->name);

free(q);//釋放所佔記憶體空間

printf("\n"); }

}

int main()

//執行效果如下圖所示:

經典演算法之約瑟夫環問題

前幾天看到乙個程式設計題,約瑟夫環問題。問題的由來是乙個猶太故事,41乙個人被困,有39個人想要自殺,想活下去的兩個人就出主意說,大家圍成乙個環,報到3的人自殺。結果兩個人成功脫險,也就誕生了這個演算法。由於本人實力有限,寫出的程式也並未進行優化,可能時間複雜度和空間複雜度上有很多問題,只希望給各位...

面試演算法之約瑟夫問題

題目 一 構建環形鍊錶 type boy struct func add num int boy help boy if num 1 小於1無法構建鍊錶 for i 1 i num i if i 1else 構建環形鍊錶 return temp 二 環形鍊錶的展示 func show temp bo...

演算法學習之約瑟夫環問題

問題 假設下標從0開始,0,1,2 m 1共m個人,從1開始報數,報到k則此人從環出退出,問最後剩下的乙個人的編號是多少?我的理解 設f m,k,i 為m個人的環,報數為k,第i個人出環的編號,m個人的環第i個出來的人就相當於m 1個人的環第i 1個出來的人,不過這個序號是相當於原來m個人的序號。但...