百练-约瑟夫问题
2013-07-30 11:40
357 查看
2746:约瑟夫问题
总时间限制:1000ms内存限制:65536kB描述约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入每行是用空格分开的两个整数,第一个是n,第二个是m(0<m,n<=300)。最后一行是:
00
输出对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
样例输入
62 124 83 00
样例输出
5 1 7
解析:
1:利用循环链表存储1....n的数字
2:通过n-1次循环逐个释放相关结点
3:关键:每次释放一个结点后p,q指针都要再次指向下一个相同结点
源代码如下:
#include<stdio.h> #include<stdlib.h> typedefstructNode{ inte; structNode*next; }Node,*DLB; voidInit(DLB&List){ List=(DLB)malloc(sizeof(Node)); List->next=List; } voidInput(DLB&List,intn){ inti; Node*p,*q; q=List; for(i=1;i<=n;i++) { if(i==1) { List->e=i; } else { p=(DLB)malloc(sizeof(List)); p->e=i; p->next=q->next; q->next=p; q=q->next; } }//for }//Input intSlve(DLB&List,intn,intm){ inti,j; Node*p,*q; p=List; q=List; for(i=1;i<=n-1;i++) { for(j=2;j<=m;j++) { p=p->next; if(j<m)q=q->next; } q->next=p->next; free(p); p=q->next; q=q->next; }//for returnq->e; } intmain() { intn,m; while(scanf("%d%d",&n,&m)&&(n!=0||m!=0)){ DLBList; inti; Init(List);//初始化循环链表 Input(List,n);//存储1...n数字 printf("%d\n",Slve(List,n,m)); }//while //system("pause"); return0; }
[/code]
相关文章推荐
- josephus(约瑟夫)问题
- java 约瑟夫问题
- poj-1012-约瑟夫问题
- 约瑟夫问题 链表法
- 循环链表解决约瑟夫问题
- 约瑟夫问题
- C\C++,用不带头结点的循坏列表实现约瑟夫问题
- 约瑟夫问题的数学方法
- Codevs 1282 约瑟夫问题
- 约瑟夫问题
- 约瑟夫问题java语言实现代码
- 【数学】约瑟夫问题
- 约瑟夫问题
- 南邮 OJ 1597 约瑟夫问题
- 约瑟夫问题:n个人围成一圈从1开始报号,报到m的出圈,直到最后1个人。
- 10行python代码实现约瑟夫问题
- 线性数据结构——约瑟夫问题
- LA 3882 And Then There Was One[约瑟夫问题的变形]
- 约瑟夫问题例题小结
- 构造数组MaxTree、环形单链表的约瑟夫问题等总结