约瑟夫环问题

来源:互联网 发布:java冒泡排序法代码 编辑:程序博客网 时间:2024/05/21 06:32
描述: 现在有n个竞争者围坐一圈,争夺一个很有吸引力的工作(年薪100w $)。假设这些人编号1,2,。。。,n。第一次从1开始报数,数到m(m>0)的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列。以此类推,直到所有人出列为止。老板说最后一个出列的人将获得这份工作。
如果你也想竞争这份工作,那么你会坐着哪个位置上?
实现一个函数,当老板告诉你n和m时,返回得到工作的那个人的编号。
运行时间限制: 无限制 
内存限制: 无限制 
输入: 竞争者人数,报数
输出: 最后出列的竞争者的编号。异常则返回 -1。
样例输入: 10,10 

样例输出: 8 

//链表实现

#include "iostream"using namespace std;struct ListNode{int num;ListNode* next;};//自定义链表实现int JosephusProblem(int n,int m){if (n<1||m<1){return -1;}//建立环struct ListNode* head =new struct ListNode();struct ListNode*  prev;head->num =1;head->next =NULL;struct ListNode* currNode =head;for (int i=1;i<n;i++){struct ListNode* cur =new struct ListNode();cur->num =i+1;cur->next =NULL;currNode->next =cur;currNode =currNode->next;}currNode->next =head;currNode =head;prev =head;while (currNode->next!=currNode){for (int i=1;i<m;i++){prev =currNode;currNode =currNode->next;}prev->next =currNode->next;delete currNode;currNode =prev->next;}int num = currNode->num;delete currNode;return num;}void main(){int n,m;cin>>n>>m;cout<<"最后的编号为:"<<JosephusProblem(n,m)<<endl;}


0 0
原创粉丝点击