Joseph问题
2013-04-24 00:16
363 查看
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~
相关文章推荐
- 一步一步求解约瑟夫(Joseph)问题
- joseph问题
- [ACM Steps] Joseph 约瑟夫环问题
- 圆圈报数最后剩下的数 约瑟夫环问题 Joseph
- JavaScript解决Joseph问题
- poj 1012 Joseph环问题
- joseph的大m问题
- Joseph问题(循环链表)
- POJ 1012 && HDU 1443 Joseph(约瑟夫问题)
- JavaScript解决Joseph问题
- NYOJ 191 && POJ 1012 Joseph(约瑟夫环问题)
- Josephu 问题 (add pin number)
- Joseph(约瑟夫环)问题分析
- 约瑟夫问题(Joseph)
- uva305 - Joseph 约瑟夫问题变形
- 算法: 约瑟夫问题(Joseph Problem)的分析
- joseph-约瑟夫环问题
- Joseph问题
- 【原】 POJ 3750 小孩报数问题 Joseph相关问题详解 解题报告
- Poj 3517 And Then There Was One Joseph核心问题