Joseph問題
好了,現在我們來看看只要是學習鏈表就會提到的Joseph問題吧!
編號爲1,2,...,n的n個人按順時針方向圍坐在一張圓桌旁,每個人手中都持有一個正整數密碼。首先輸入一個正整數作爲報數上限值m,然後從第一個人開始按順時針方向自1開始順序報數,報到m的人離開桌旁,並將它手中的密碼作爲新的m值,從順時針方向的下一個就坐在桌旁的人開始重新從1報數,如此下去,直到所有的人都離開桌旁爲止。設計程序模擬該過程。
Joseph問題示意圖:
圈內的數字是元素編號,旁邊是每個人抽到的密碼值,* 是每輪起始的位置。
程序代碼:
#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(ListNode)
typedef struct{
int num;
int password;
struct ListNode *next;
}ListNode;
typedef ListNode *LinkList ;
int main()
{
int n, i, j, pass, ini ;
printf("Please enter the number of the players:");
scanf("%d", &n);
LinkList p, pr, head;
head = pr = ( LinkList )malloc( LEN );
for( i = 1; i < n; i++){
p = ( LinkList )malloc( LEN );
printf("Please enter the password of player NO.%d", i);
scanf("%d", &pass);
pr->next = p;
if ( i == 1)
head->next = p;
p->num = i;
p->password = pass;
pr = p;
}
printf("Please enter the password of player NO.%d", i);
scanf("%d", &pass);
pr->next = head;
head->num = n;
head->password = pass;
p = head;
printf("Please enter the initial password:");
scanf("%d", &ini);
for( i = 1; i <= n; i++){
for( j=1; j <= ini; j++){
pr = p;
p = p->next;
}
ini = p->password;
printf("%d -> ", p->num);
pr->next = p->next;
p = pr;
}
return 0;
}
運行截圖:
Joseph問題最重要的是循環鏈表的使用。
P.S. 其實,我最早知道的Joseph問題是說Joseph和他的朋友被困城堡,所有人是採取m值爲固定的形式去自殺的。於是Joseph同學就可以根據固定的m值算出大家自殺的順序從而使得自己和朋友可以免遭此厄運。但是換成了這種每個人手中持有密碼的方式,那麼自殺的順序也就不能預料了。也許,大家都知道了最爲原始版本的Joseph問題,於是想出了這樣的解決方案。
最後的最後,忙了一天回宿舍真的什麼都不想幹,有人知道persistence霸氣的紋身嗎?然後就感覺雞血橫飛的 O(∩_∩)O~