選猴王(約瑟夫問題)

2021-10-03 12:06:13 字數 1902 閱讀 4493

一群猴子要選新猴王。新猴王的選擇方法是:

讓n只候選猴子圍成一圈,從某位置起順序編號為1~n號。

從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。

如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。

請問是原來第幾號猴子當選猴王?

整體思路:

建立頭尾相連的鍊錶,將每個猴子編號,迴圈篩選。
#include

#include

struct monkey

;struct monkey *

creathead()

;//建立頭節點

void

rank

(int n,

struct monkey *head)

;//給n個猴子標號

void

delete_node

(struct monkey *head,

struct monkey *delete_one)

;//刪除其中單個鍊錶單元,是下面函式的輔助函式。

struct monkey *

delete_

(struct monkey *head)

;//刪除所有 3 的猴

struct monkey *list;

//鍊錶的頭

intmain

(void

)/*建立頭節點*/

struct monkey *

creathead()

/*對n個猴子進行標號*/

void

rank

(int n,

struct monkey*head)}}

/*刪除鍊錶單元,輔助函式*/

void

delete_node

(struct monkey *head,

struct monkey *delete_one)

pre = now;

now = pre->next;}}

/*刪除至只剩猴王*/

struct monkey *

delete_

(struct monkey *head)

else

//判斷是否是頭節點 如果是則往前乙個單元

if(now->number ==-1

)

d++;}

return now;

}

2小時【(((φ(◎ロ◎;)φ)))?】

人家10行解決;

我啥都不想說了

純數學解決:

#include

intmain

(void

)printf

("%d\n"

, s +1)

;return0;

}

還有用陣列解決:

#define n 50

#include

intmain

(void

) i =0;

k =0;

m =0;

while

( m < n -1)

if( k ==3)

i++;if

( i == n )

} i =0;

while

( num[i]==0

)printf

("%d留下\n"

, i+1)

;return0;

}

猴群選猴王(約瑟夫問題)詳解

約瑟夫問題的題目和描述就不說了,題目鏈結有很多,我直接瞎選了乙個,自己看看就可以 點這裡,原版題目,自己試試看 洛谷的題 首先說思路,每一輪都會有1個人退出,在這裡我們會關心誰退出了,誰留下來。第一輪 第m n個人退出 第二輪 第2m n個人退出 第n 1輪 第 nm m n個人退出 此時還剩下乙個...

選猴王問題

一群猴子有50只,坐在一起選猴王,每只猴子都有乙個編號1 50。從1號猴子開始報號,報到7號則退出 下只猴子繼續從1開始報,依次迴圈,則最後的乙隻猴子為猴王。試求出這只猴子的編號。include includetypedef int elemtype typedef struct lnode lis...

需找新的美猴王 約瑟夫環 猴王問題

曰 初時,天地混沌未開,後盤古生而開之,三皇五帝治世,世界遂分四大部洲。東洲有山,曰花果山,天生一石猴,石破天驚,王於群猴。求藝,實菩提名之曰 悟空 後悟空大鬧天宮,為佛祖所困,五百載,為觀音點化,乃保唐曾取經,歷八十一難而成正果,封鬥戰勝佛,自此聞達三界,而昔日 美猴王 之名亦漸成經久之傳說 話說...