q:一群猴子,編號是1,2,3 …m,這群猴子(m個)按照1~m的順序圍坐一圈。從第1只開始數,每數到第n個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最後乙隻猴子,則該猴子為大王。輸入m和n,輸出為大王的猴子是幾號。
a:用乙個迴圈單鏈表來表示這一群猴子。節點含有0:乙個儲存猴子的編號,乙個為指向下乙隻猴子的指標,編號為m的結點再指向編號為1的結點,以此構成環形的鏈。當數到第n個時,該結點被刪除,繼續數,直到只有乙個結點。(這個問題是經典的演算法問題,很多問題可以抽象成這個問題)
**如下:
q2:(約瑟夫問題)#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);
}
此問題與猴子選大王類似,只不過是從選猴王變成了自殺,不再贅述,**如下:
/*約瑟夫環*/
#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 設定陣列指標 ...