猴子選大王問題

2021-06-10 03:15:12 字數 1013 閱讀 7723

猴子選大王(亞瑟夫換)的問題是資料結構和演算法中常見的一類問題。可以使用迴圈佇列實現,也可以使用鍊錶實現。還可以使用陣列的回溯法實現。

m只猴子要選大王,選舉辦法如下:所有猴子按1,2……n編號圍成一圈,從第一號開始順序1,2……m,凡是報m號的退出圈外,如此迴圈報數直到圈內只剩乙隻猴子時這只猴子就是大王。

方法一:鍊錶法:

#include #include #define n 8

#define m 3

typedef struct monkey

monkey;

int main()

q->next=head; //建立迴圈鍊錶

p=head;

printf("對猴子進行編號!\n");

for(i=1;i<=n;i++) //給n只猴子分別建立順序編號

i=0; //初始化

p=head;

while(1)

else

}printf("勝出:%d號猴子",p->num);

}

方法二:使用陣列回溯法。

回溯法是:將猴子總個數迴圈,第一次迴圈都是將當前需要出圈的猴子排列到陣列的末尾。這樣全部猴子迴圈一遍後,陣列頭的猴子極為猴王。注意,迴圈一起找出第乙個之後將之迴圈它之前的剩餘陣列。即程式中的for(i=max-1;i>=0;i--)

#include#include#define max 30/*定義猴子總數*/

int i,j,k,temp;

int monkey[max],s;

void init()

void main()

{ init();

printf("請輸入出隊的序數:");

scanf("%d",&s);/*讀取猴子出隊序數*/

for(i=max-1;i>=0;i--)

{ for(k=1;k<=s;k++)

{ temp=monkey[0];

for(j=0;j

猴子選大王問題

創立乙個記錄編號的陣列,用指標在這個陣列迴圈移動計數,當計數為m時將這個元素做移除標記,直到剩下最後乙個元素。1 intmain 211 int p v 0 12 int z 0,x 1,co 1 z為剔除元素個數,x為元素在陣列中位置,co為計數 13for 1423 p 24 x 25 26if...

猴子選大王

方法一 include int main 初始化猴子全沒出局 值為0 int count 0 排除的猴子數量 int key 0 剩下的資料索引,即最後要得到的是陣列中第幾隻猴子是大王 int i 0,index 0 i代表計數器1 7,index代表陣列下標 while count 14 當猴子數...

猴子選大王

問題描述 一群猴子,編號是1,2,3 m,這群猴子 m個 按 照1 m的順序圍坐一圈。從第1只開始數,每數到第n個,該猴子就 要離開此圈,這樣依次下來,直到圈中只剩下最後乙隻猴子,則該 猴子為大王。輸入m和n,輸出為大王的猴子是幾號。輸入描述 m個猴子和要出去的位數n。程式輸出 king是誰。inc...