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~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值