- 题目链接:
- http://bailian.openjudge.cn/practice/2746
- 描述
- 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
- 输入
- 每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:
0 0 - 输出
- 对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
- 样例输入
-
6 2 12 4 8 3 0 0
- 样例输出
-
5 1 7
1 /*约瑟夫问题(单向循环链表解法) 2 先创建含有n个猴子结点的单向循环链表,然后模拟报数过程,将第m个猴子结点删除,最后当只有一个猴子结点时跳出循环,输出结果*/ 3 #include<stdio.h> 4 struct Monkey{ 5 int id; 6 Monkey *next; 7 }; 8 int main(){ 9 int n,m; 10 int i; 11 Monkey *link, *monkey, *lastmonkey; 12 while(scanf("%d%d",&n,&m), n+m != 0){ 13 if(m==1){//当m为1时直接输出n 14 printf("%d\n",n); 15 continue; 16 } 17 18 link=lastmonkey=NULL; 19 for(i=1;i<=n;i++){ 20 monkey = new Monkey; 21 monkey->id=i; 22 monkey->next=NULL; 23 if(link == NULL){ 24 link = lastmonkey = monkey; 25 } 26 else{ 27 lastmonkey->next=monkey; 28 lastmonkey=monkey; 29 } 30 } 31 /*遍历 32 monkey=link; 33 while(monkey != NULL){ 34 printf("%d ",monkey->id); 35 monkey= monkey->next; 36 }*/ 37 lastmonkey->next=link;//构成环 38 39 int count=1;//从1开始计数 40 while(link->next != link){ 41 if(count == m-1){ 42 monkey=link->next; 43 link->next=monkey->next; 44 count=0; 45 delete monkey; 46 } 47 link=link->next; 48 count++; 49 } 50 printf("%d\n",link->id); 51 delete link; 52 } 53 return 0; 54 }
2746 约瑟夫问题(单向循环链表解法)
Posted Reqaw’s Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2746 约瑟夫问题(单向循环链表解法)相关的知识,希望对你有一定的参考价值。
以上是关于2746 约瑟夫问题(单向循环链表解法)的主要内容,如果未能解决你的问题,请参考以下文章