Joseph問題

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~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章