约瑟夫环问题-C++编程实现
来源:互联网 发布:双语教学软件 编辑:程序博客网 时间:2024/05/16 14:32
原题:一组人(n)个,围成一圈,从某人开始数到滴三个的人出列,在接着从下一个人开始数,最终输出最终出列的人(约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3,...,n)分别表示)围坐在一张圆桌周围。从编号k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,知道圆桌周围的人全都出列。
<pre name="code" class="cpp">#include <iostream>#include <list>#include <vector>#include <algorithm>using namespace std;vector<int> yuesefeng(int n,int m);void main(){int n,m;cin>>n>>m;vector<int> out;out=yuesefeng(n,m);int i,len=out.size();for(i=0;i<len;i++)cout<<out[i]<<" ";system("pause");}vector<int> yuesefeng(int n,int m)//n代表初始人数,m代表初始号码{vector<int> out;list<int> in;list<int>::iterator pos;int i;for(i=1;i<=n;i++)in.push_back(i);pos=in.begin();int kk=m; while(in.size()!=0){if(kk!=1) { pos++; kk--; if(pos==in.end())//注意要判断是否到尾部了,到尾部就指向头部pos=in.begin(); }else{out.push_back(*pos);//到数了,点到的人保存到输出pos=in.erase(pos);///将此人从列表中删除,注意erase返回的是下个人的指针if(pos==in.end())pos=in.begin();} }return out;}
法二,自己建立循环链表来实现:
/* 程序:约瑟夫死亡环 功能:用户输入N,S,D值,从S至N至1开始顺序循环数数,每数到D输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus) 时间:2015.1.10 创建人:Evankaka*/#include <iostream>using namespace std;// 链表节点typedef struct _RingNode{ int pos; // 位置 struct _RingNode *next;}RingNode, *RingNodePtr;// 创建约瑟夫环,pHead:链表头指针,count:链表元素个数void CreateRing(RingNodePtr pHead, int count){ RingNodePtr pCurr = NULL, pPrev = NULL; int i = 1; pPrev = pHead; while(--count > 0) { pCurr = (RingNodePtr)malloc(sizeof(RingNode)); i++; pCurr->pos = i; pPrev->next = pCurr; pPrev = pCurr; } pCurr->next = pHead; // 构成环状链表}void PrintRing(RingNodePtr pHead){ RingNodePtr pCurr; cout<<pHead->pos; pCurr = pHead->next; while(pCurr != NULL) { if(pCurr->pos == 1) break; cout<<pCurr->pos; pCurr = pCurr->next; }}void KickFromRing(RingNodePtr pHead, int m){while(pHead==NULL)return; RingNodePtr pCurr, pPrev; int i = 1; // 计数 pCurr = pPrev = pHead; while(pCurr != NULL) { if (i == m) { // 踢出环 cout<<pCurr->pos<<" "; // 显示出圈循序 pPrev->next = pCurr->next; free(pCurr); pCurr = pPrev->next; i = 1; } pPrev = pCurr; pCurr = pCurr->next; if (pPrev == pCurr) { // 最后一个 cout<< pCurr->pos; // 显示出圈循序 free(pCurr); break; } i++; }}int main(){ int d = 0, n = 0,s=0; RingNodePtr pHead = NULL; cout<<"---------------Josephus Ring---------------\n"; cout<<"n(总共人数) = "; cin>>n; cout<<"d(出去人的编号) = "; cin>>d;cout<<"s(第一次开始计数的位置) = ";cin>>s; if(n <= 0 || d <= 0|| s<=0) { cout<<"Input Error\n"; system("pause"); return 0; } // 建立链表 pHead = (RingNodePtr)malloc(sizeof(RingNode)); pHead->pos = 1; pHead->next = NULL; CreateRing(pHead, n); // PrintRing(pHead); // 开始出圈 cout<<"死亡顺序: ";//更改下表头开始计数的位置while(s--!=1)pHead=pHead->next; KickFromRing(pHead,d); cout<<"\n"; system("pause"); return 0;}
1 0
- 编程实现约瑟夫环问题
- 约瑟夫环问题编程实现
- 编程实现约瑟夫环问题
- 【约瑟夫】编程实现约瑟夫环
- 约瑟夫环的问题编程C++实现
- 约瑟夫环问题-C++编程实现
- C语言实现约瑟夫环问题
- C/C++编程题 约瑟夫环问题分析
- 用链表实现约瑟夫问题(c/C++)
- 约瑟夫环问题(c语言数组实现)
- Josephus(约瑟夫环问题)循环单链表c语句实现!
- 【c++】约瑟夫环问题的链表实现
- 约瑟夫环的编程实现
- c之约瑟夫环问题
- C语言/约瑟夫环问题
- 【C语言】 约瑟夫环问题
- C 单链表 实现约瑟夫环
- C++vector实现约瑟夫环
- 角色Ajax和JavaScript开发社交网络
- 黑马程序员--我以为18岁的我出去拿个8、9千就差不多了,没想到...haha~~
- 规划在HTML5中使用JavaScript和CSS3考试是特意安排的Java经理
- 在带(继承)TextView的控件中,在代码中动态更改TextView的文字颜色
- 蒺藜Terrestris- Gokshura - 有效的草药泌尿消毒剂
- 约瑟夫环问题-C++编程实现
- linux下.vimrc的配置与使用
- 关于android输入法
- 获得Mb2-703的Microsoft Dynamics CRM 2013的自定义和配置
- 对于编程的工作,我可以做到这样
- 股票投资在尼日利亚其过程与收益
- 经济衰退的证据营销费用
- 更新证书或svn更新代码错误:Your build settings specify a provisioning profile with the UUID‘XXX’
- OnScrollListener回调分析