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~

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