约瑟夫问题 三种实现方法
来源:互联网 发布:cam360下载监控软件 编辑:程序博客网 时间:2024/05/29 04:53
约瑟夫问题的描述:有N个人坐成一圈,编号为1之N,从编号为1的人开始传递热马铃薯,M次传递之后,持有马铃薯的人退出游戏,然后从退出人的下一个继续游戏,传递M次之后,持有人退出继续游戏。最终留下来的人获胜。
用list实现
list<int> JosephusProblem_solution1(int m,int n){ list<int> jose;//用于编号1至N list<int> res;//用于记录退出编号的次序; int mp; for(int i=1;i<=n;i++){ jose.push_back(i);//编号 } list<int>::iterator litr=jose.begin(); //这里必须明白list.begin()和list.end() //为什么litr只自加m-1次? //为什么jose.end()时litr=jose.end(),而不用litr++? for(int i=0;i<n;i++){ for(int j=0;j<m-1;j++){ if(++litr==jose.end()){ litr=jose.begin(); } } list<int>::iterator del = litr; res.push_back(*litr); //避免删除最后一个元素时,找不到下一个起始点 if(++litr==jose.end()){ litr=jose.begin(); } jose.erase(del); } return res;}
单向循环链表实现
int JosephusProblem_solution3(int m,int n){ if(n<1||m<1){ return -1; } struct listNode{ int num; struct listNode *next; listNode(int n=0,listNode *p = NULL){ num=n;next = p; } }; listNode *head = new listNode(1); listNode *CurrentNode = head; listNode *tail = NULL; for(int i=2;i<=n;i++){ CurrentNode->next=new listNode(i); CurrentNode = CurrentNode->next; } CurrentNode->next = head; tail=CurrentNode; free(CurrentNode); //cout<<"--------------"<<endl; //这里自己画图就可以理解 //head为tail的前一个节点,且同步移动 //移动M次后tail->next = head->next,即删除了第M个元素, //再将head作为tail前一个元素即可 while(tail!=head){ for(int i=0;i<m-1;i++){ tail=head; head=head->next; } tail->next = head->next; free(head); head=tail->next; } //cout<<tail->num<<endl; return tail->num;}
数学方法实现
int JosephusProblem_solution2(int m,int n){ if(m<1||n<1){ return -1; } int *res = new int[n+1]; res[1] = 0; for(int i=2;i<=n;i++){ res[i] = (res[i-1]+m)%i; } int result = res[n]; delete []res; return result+1;}
有不严谨的地方,见谅!
0 0
- 约瑟夫问题 三种实现方法
- 【苦练基本功1】三种方法实现约瑟夫环问题
- 约瑟夫问题三种求解方法
- 三种方法求解约瑟夫环问题
- 约瑟夫环出圈问题三种求解方法
- 约瑟夫问题实现的方法总结
- 约瑟夫环的三种实现方式
- 约瑟夫环的三种实现
- 数据结构三:循环链表解决约瑟夫问题实现
- 2种方法求解约瑟夫环问题
- 求解约瑟夫问题两种方法
- 约瑟夫问题C++实现
- 约瑟夫问题C++实现
- “约瑟夫问题”实现代码
- 约瑟夫问题的实现
- 约瑟夫问题程序实现
- java实现约瑟夫问题
- 约瑟夫问题的实现
- 英文版ubuntu安装中文输入法
- java异常机制
- linux ubuntu debian 使用笔记
- 开机顺序
- 字符串读写...fgets 函数的使用
- 约瑟夫问题 三种实现方法
- 如何利用 BTSync 在VPS上搭建私有云储存
- Python 爬虫的实践运用(1)--爬取百度百科的词条
- HIbernate inverse和cascade属性
- 《Monkey Android》第15课Spinner和AutoCompleteTextView
- C#编程中的三中结构
- AFN网络框架2.x版—返回XML的情况
- JavaScript进阶(二)在一个JS文件中引用另一个JS文件
- 未能加载文件或程序集“NPOI”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。