C語言解決約瑟夫問題演算法

2021-07-03 14:37:07 字數 1151 閱讀 7528

據說著名猶太歷史學家 josephus有過以下的故事:在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所有人都自殺身亡為止。然而josephus 和他的朋友並不想遵從。首先從乙個人開始,越過k-2個人(因為第乙個人已經被越過),並殺掉第

k個人。接著,再越過k-1個人,並殺掉第

k個人。這個過程沿著圓圈一直進行,直到最終只剩下乙個人留下,這個人就可以繼續活著。問題是,給定了和,一開始要站在什麼地方才能避免被處決?josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲

。這就是著名的約瑟問題的由來。

約瑟夫問題是個有名的問題:n個人圍成一圈,從第乙個開始報數,第m個將被殺掉,最後剩下乙個,其餘人都將被殺掉。例如n=6,m=5,被殺掉的順序是:5,4,6,2,3,1。

我寫的解決約瑟夫問題的演算法如下:

void newjosephus (int n,int order,int remain)

else

m->next=q->next;

printf("%d ",q->data);

free(q);

q=m->next;

count=1;

n-=1;

if(n==remain)

}else

}p->next=q;

printf("\n剩下的人為:\n");

for(i=0;idata);

q=q->next;}}

}

其中,n為人的總數,order即為第幾個人被pass掉,remain是剩下人的個數。

建立單迴圈鍊錶的演算法如下:

j* createlink(int n)

q->next=head->next;

return head;

}

輸入41,3,2(即求原始的約瑟夫問題的解),結果如圖

如果有不足之處,還望大家指出!

C語言 約瑟夫問題

維基百科說明 約瑟夫問題 有時也稱為約瑟夫斯置換 是乙個出現在電腦科學和數學中的問題。在計算機程式設計的演算法中,類似問題又稱為約瑟夫環。人們站在乙個等待被處決的圈子裡。計數從圓圈中的指定點開始,並沿指定方向圍繞圓圈進行。在跳過指定數量的人之後,執行下乙個人。對剩下的人重複該過程,從下乙個人開始,朝...

C語言 約瑟夫問題

題目中30個人圍成一圈,因而啟發我們用乙個迴圈的鏈來表示,可以使用結構陣列來構成乙個迴圈鏈。結構中有兩個成員,其一為指向下乙個人的指標,以構成環形的鏈 其二為該人是否被扔下海的標記,為1表示還在船上。從第乙個人開始對還未扔下海的人進行計數,每數到9時,將結構中的標記改為0,表示該人已被扔下海了。這樣...

C語言迴圈鍊錶解決約瑟夫問題

joseph problem 35分 題目內容 實作joseph problem.假設一開始有n個人,編號1 n,按照順序以順時針圍成乙個圓圈。遊戲開始時,編號1的人拿刀。之後每一輪刀子會被往下傳m個人,而當輪最後拿到刀子的人會將他的下乙個人殺掉,殺完後刀子會再傳給被殺的下乙個人。這樣一輪就算結束。...