約瑟夫問題 猴王問題(兩種種實現方法)

2021-10-06 18:58:54 字數 2302 閱讀 9125

問題描述:

一、迴圈鍊錶實現約瑟夫問題

思路:建立乙個迴圈鍊錶,按順序依次列入結點。進行遍歷,遍歷為第 m 個的結點刪除,連線該節點的前乙個和後乙個結點,保持鍊錶的完整性

迴圈鍊錶實現的關鍵點:

1、如何搭建迴圈鍊錶

2、如何查詢並且刪除指定結點,且不影響整個鍊錶的完整性

實現:迴圈鍊錶的搭建(在研究此**前,建議先了解一下鍊錶的原理影象)

link headnode =

(link)

malloc

(sizeof

(monkey));

headnode->next =

null

;link tailnode,pnode,qnode;

while(1

)else

}}

查詢並刪除結點

link headnode =

(link)

malloc

(sizeof

(monkey));

headnode->next =

null

; link tailnode,pnode,qnode;

int answer[

300]

;int count =0;

int n,m;

int i=1;

while(1

)else}}

}

原始碼:

#include

#include

typedef

struct monkeymonkey,

*link;

intmain()

else

pnode = headnode->next;

//對要進行遍歷查詢的指標進行初始化

i =1;

qnode = tailnode;

//這個指標指向遍歷查詢的指標的前乙個結點,便於結點的刪除操作

while

(pnode != qnode)

else}}

headnode->next = qnode;

//該語句是保障頭結點與最後留下的結點保持鏈結

answer[count]

= pnode->data;

//用陣列記錄此次迴圈找到的「猴王」

count++

;free

(pnode)

; headnode->next =

null

;//再初始化頭結點

}for

(int j=

0;j)//遍歷每次找到的猴王

printf

("%d\n"

,answer[j]);

return0;

}

二、陣列下標實現約瑟夫問題思路:定義乙個陣列,初始化存在猴子的元素。遍歷時如果元素為0,則跳過,如果元素不為0,則將該元素變為0,直到陣列中只剩下乙個陣列元素不為0

關鍵:在遍歷到最後乙個元素的時候,如何回到第乙個元素再遍歷

如何在遍歷到最後乙個元素後再回到第乙個元素

int n,m,monkey;

int count =0;

int answer[count]

;int i =1;

int pos;

while(1

)else

}else

}}

原始碼:

#include

intmain()

;//陣列初始化

for(

int j=

0;j) i =1;

monkey = n;

pos =0;

//下標標誌,重中之重的標誌

while

(monkey>1)

else

}else

}for

(int j=

0;j}}

for(

int j=

0;j)printf

("%d\n"

,answer[j]);

return0;

}

選猴王(約瑟夫問題)

一群猴子要選新猴王。新猴王的選擇方法是 讓n只候選猴子圍成一圈,從某位置起順序編號為1 n號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下乙隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的乙隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?整體思路 建立頭尾相連的鍊錶,將...

約瑟夫問題兩種實現方式

陣列版本 include include main int p int malloc len sizeof int printf 請輸入步長 n scanf d pace if pace 0 if pace 0 printf 請輸入進行輪數 n scanf d time printf 請輸入您想從那...

約瑟夫問題兩種實現方式

陣列版本 include include main int p int malloc len sizeof int printf 請輸入步長 n scanf d pace if pace 0 if pace 0 printf 請輸入進行輪數 n scanf d time printf 請輸入您想從那...