(程式設計師面試寶典)已知n個人圍坐在一張圓桌旁,從編號為k的人開始..................
阿新 • • 發佈:2019-01-18
【題目】
設有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;
}