程序员人生 网站导航

用C++实现约瑟夫环的问题

栏目:互联网时间:2014-11-13 08:45:55

约瑟夫问题是个着名的问题:N个人围成1圈,从第1个开始报数,第M个将被杀掉,最后剩下1个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。

  假定在圈子里前K个为好人,后K个为坏人,你的任务是肯定这样的最少M,使得所有的坏人在第1个好人之前被杀掉。

 

//----数学中有乘法口诀。。那只是工具。我们都很熟习。

//----C++中有1些基本的程序。也只是工具我们必须像熟习乘法口诀1样去熟习这些程序。

//----很基础的1些东西必须熟练。。。

#include<iostream> class link; using namespace std; class node{ friend class link; public: node():next(NULL){} node(int value):data(value),next(NULL){} private: int data; node *next; }; class link{ public: link(int x,int y,int z):n(x),s(y),m(z){} node *createlink() { node *p,*r; node *q; r=p=new node; for(int i=1;i<=n;++i) { q=new node; q->data=i; r->next=q; r=q; } r->next=p->next; return p; } node *jusefu(node *startnode) { node *p=startnode->next; node *q; for(int i=1;i<s;++i) p=p->next;//让p指向开始数数的位置,让q指向需要删除结点的位置的前1个位置 q=p->next; while(q->next!=p) { q=q->next; } while(p->next!=p) { for(int j=1;j<m;++j) { //node *tmp; q=p; p=p->next; } q->next=p->next; cout<<"将要删除的号码是"<<p->data<<endl; delete p; p=q->next; } cout<<"留下来的人数的号码为"<<p->data<<endl; return p; } private: int n; int s; int m; }; int main() { int i,j,k; cout<<"输入总数,开始位置;每次循环人数"<<endl; cin>>i>>j>>k; link linklist(i,j,k); node *head=linklist.createlink(); node *lastnode=linklist.jusefu(head); system("pause"); return 0; }


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐