借助鍊錶解決猴子選大王問題 約瑟夫環問題

2021-07-10 20:57:21 字數 1727 閱讀 5897

q:一群猴子,編號是1,2,3 …m,這群猴子(m個)按照1~m的順序圍坐一圈。從第1只開始數,每數到第n個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最後乙隻猴子,則該猴子為大王。輸入m和n,輸出為大王的猴子是幾號。

a:用乙個迴圈單鏈表來表示這一群猴子。節點含有0:乙個儲存猴子的編號,乙個為指向下乙隻猴子的指標,編號為m的結點再指向編號為1的結點,以此構成環形的鏈。當數到第n個時,該結點被刪除,繼續數,直到只有乙個結點。(這個問題是經典的演算法問題,很多問題可以抽象成這個問題)

**如下:

#include

#include

#include

#define ok 1

#define error 0

#define true 1

#define false 0

#define maxsize 10

typedef

int status;

typedef

int elemtype;

typedef

struct nodenode;

typedef

struct node* linklist;

int main(void)

q->next=head;//鍊錶尾指向煉表頭

p=head;//開始計數

for(i=1;i//迴圈m-1輪,淘汰m-1只猴子

for(j=1;j1;j++)

q=p->next;//q指向要淘汰的猴子

printf("第%d輪淘汰第%d只猴子\n",i,q->num);

p->next=q->next;//刪除q

p=q->next;//一定要讓下一次計數起點為被刪除元素的後繼

free(q);//釋放q

}king=p->num;

free(p);

printf("猴王是第%d\n",king);

}

q2:(約瑟夫問題)

此問題與猴子選大王類似,只不過是從選猴王變成了自殺,不再贅述,**如下:

/*約瑟夫環*/

#include

#include

#define ok 1

#define error 0

typedef

int status;

typedef

int elemtype;

typedef

struct peoplepeople;

typedef

struct people* linklist;

int main(void)

else

qmove->next=head;

i=0;

pmove=head;

while(i1)

for(i=1;ifor(j=1;j1;j++)

qmove=pmove->next;

printf("第%d輪殺死編號為%d的人\n",i,qmove->num);

pmove->next=qmove->next;

pmove=qmove->next;/*一定要讓下一輪迴圈的起點為被刪除元素的後繼*/

free(qmove);}}

killed=pmove->num;

free(pmove);

printf("倖存者為%d號\n",killed);

}

鍊錶經典問題 猴子選大王

n 只猴子要選大王,選舉方法如下 所有猴子按1,2 n 編號並按照順序圍成一圈,從第 1個猴子起,由 1開始報數,報到 m時,該猴子就跳出圈外,下乙隻猴子再次由 1開始報數,如此迴圈,直到圈內剩下乙隻猴子時,這只猴子就是大王。include includeusing namespace std ty...

golang資料結構之用迴圈鍊錶解決約瑟夫環問題

josephu.go package link import fmt type kid struct func addkid num int kid cur kid if num 1 for i 1 i num i if i 1 else cur.next tmpkid cur tmpkid cur...

php猴子選大王問題解決方法

問題描述 一群猴子排成一圈,按1,2,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去.如此不停的進行下去,直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求程式設計模擬此過程,輸入m n,輸出最後那個大王的編號。解決方法 i 0 設定陣列指標 ...