【题目】
设有n个人(以编号为1,2,3…….n分别表示)围坐在圆桌周围,从编号为k的人开始报数,数到m的人就站出来,他的下一个人又从1开始报数,数到m的人就站出来,依此规律重复下去,知道全部的人都站出来为止。
【代码实现】
这里选择循环链表作为数据结构。
#include<iostream>
using namespace std;
struct node
{
int data;
node *next;
};
class linklist
{
public:
linklist() //利用构造函数对循环链表进行初始化
{
node *p=new node();
p->data=1;
p->next=p;
first=p;
};
void josephus(int n,int k,int m);
private:
node *first;
};
void linklist::josephus(int n,int k,int m)
{
node *q=first;
for(int i=2;i<=n;i++) //建立循环链表(编号为1,2,3..........N)
{
node *p=new node();
p->data=i;
p->next=q->next;
q->next=p;
q=p;
}
//---------找到第一个报数的人,p记录当前报数的位置,r为报数的前一个位置----------
node *p=first;
node *r;
while(--k)
{
r=p;;
p=p->next;
}
//----------把这n个元素依次出列--------
cout<<"n个元素依次出列:";
while(n--)
{
for(int s=1;s<m;s++) //从当前元素开始报数,报数为m的元素出列,p指向出列元素
{
r=p;
p=p->next;
}
r->next=p->next;
cout<<p->data<<" ";
p=r->next; //此时p指向被删元素的下一个元素
}
cout<<endl;
}
int main()
{
linklist L;
L.josephus(9,1,5);
system("pause");
return 0;
}
这是一道程序员面试题目,描述了n个人围坐圆桌,从编号k开始报数,每数到m的人出局,以此类推直到所有人都出局。解决方案采用循环链表数据结构来模拟过程。

1554

被折叠的 条评论
为什么被折叠?



