1.約瑟夫問題
設編號為1,2,… m的m個人圍坐一圈,從1開始報數,數到n 的那個人出列,它的下一位又從1開始報數,數到n的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。
1 2 3 4 5 6 7 8
第1 次出列 6 a[5]=0 total=1
1 2 3 4 5 7 8
第2次出列4 a[3]=0 total=2
1 2 3 5 7 8
第3次出列4 a[2]=0 total=3
1 2 5 7 8
第4次出列5 a[4]=0 total=4
1 2 7 8
第5次出列8 a[7]=0 total=5
1 2 7
第6次出列7 a[6]=0 total=6
第7次出列2 a[1]=0 total=7
1此時只剩下最後乙個數,停止刪除
利用陣列(向量)解決問題:
#include
#include
int main()
array=
(int*
)calloc
(m,sizeof
(int));
//建立乙個動態陣列陣列長度為m
for(i=
0; i) array[i]=1
;//利用迴圈給陣列中元素賦初值1 其中1代表未出列 0代表出列
i=0;
total=0;
a=0;
for(
; total1; i++)}
for(i=0;
1; i++)if
(array[i]==1
)//輸出最後乙個留下來的人
free
(array)
;return0;
}
##(2) 鍊錶儲存演算法
(a)用迴圈鍊錶儲存m個人的位置資訊。
(b)當報數到需要出列的結點時,刪除該結點。
(c)當只剩下乙個結點都出列後,迴圈結束,輸出最後剩下的。
4. 測試資料模擬演算法執行過程
m=8 6
1 2 3 4 5 6 7 8
第1 次出列 6 刪除第六個節點
1 2 3 4 5 7 8
第2次出列4 刪除第四個節點
1 2 3 5 7 8
第3次出列3 刪除第三個節點
1 2 5 7 8
第4次出列5 刪除第五個節點
1 2 7 8
第5次出列8 刪除第八個節點
1 2 7
第6次出列7 刪除第七個節點
1 2第7次出列2 刪除第二個節點
1此時只剩下乙個節點,停止刪除
用鍊錶來解決約瑟夫環問題:
#include
#include
static struct node *head,
*rear,
*temp,
*temp1;
static int m,n;
struct node
;//構建乙個鍊錶,其中儲存著序號
struct node *
creat()
rear-
>next=head-
>next;
return head;
}//建立鍊錶並且將其構成單向迴圈鍊錶,其中head為頭指標,rear為尾指標
struct node delete()
;//這個函式用來刪除鍊錶中的節點,同時輸出每次被刪除節點的序號
int main()
head=
creat()
; temp=head-
>next;
temp1=head;
int i=1;
for(
;flag1;i++
) temp1=temp;
temp=temp-
>next;
}//利用迴圈來找到每次報數為n的節點,再利用函式將其刪除
printf
("\n最後剩下的是%d\n"
,temp-
>num)
;free
(temp)
;return0;
}
C語言猴子選王鍊錶實現
一堆猴子有m個,編號分別是1,2,3 m,這m個猴子按照編號1,2,m的順序圍坐一圈,然後從第1開始數,每數到第n個,該猴子就要離開此圈,這樣依次下來,直到圈中只剩下最後乙隻猴子,則該猴子就為大王。要求 分別採用向量及鍊錶兩種儲存方式實現該問題的求解,給出一組m和n,輸出對應的猴王。include ...
C語言程式設計 猴子選大王 鍊錶應用
description 有n只猴子,從1 n進行編號。它們按照編號的順時針方向排成乙個圓圈,然後從第一只猴子開始報數。第一只猴子報的第乙個數字為1,以後每只猴子報的數字都是它們前面猴子所報數字加1。如果乙個猴子報的數字是m,則該猴子出列,下乙個猴子重新從1開始報數,直到所有猴子都出列為止,最後乙個出...
鍊錶經典問題 猴子選大王
n 只猴子要選大王,選舉方法如下 所有猴子按1,2 n 編號並按照順序圍成一圈,從第 1個猴子起,由 1開始報數,報到 m時,該猴子就跳出圈外,下乙隻猴子再次由 1開始報數,如此迴圈,直到圈內剩下乙隻猴子時,這只猴子就是大王。include includeusing namespace std ty...