练习-圆桌问题
圆桌问题
学会链表的练手题:
题目描述
圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。
思路
循环双链表来模拟圆桌顺时针和逆时针
题解
#include<iostream>
using namespace std;
struct linknode{
char date;
linknode *next;
linknode *pre;
};
void insertNode(linknode *p)
{
linknode *tmp=new linknode;
tmp->date='B';
tmp->next=p->next;
p->next->pre=tmp;
tmp->pre=p;
p->next=tmp;
}
int main()
{
int n=0,m=0;
while(cin>>n>>m)
{
linknode *head=new linknode;
linknode *p=NULL,*rear=head;
head->date='G';
for(int i=0;i<n-1;++i)
{
p=new linknode;
p->date='G';
rear->next=p;
p->pre=rear;
rear=p;
}
rear->next=head;
head->pre=rear;
// 在head后插入一个'B',从这里开始往后数m个,在最后一个后面插入'B',总共执行n次插入
insertNode(head);
p=head->next;
for(int i=1;i<n;++i)
{
for(int j=1;j<m;++j)
p=p->next;
insertNode(p);
p=p->next;
}
for(int j=1;j<m;++j)
p=p->next;
int t=0;
for(int i=0;i<2*n;++i)
{
cout<<p->date;
p=p->pre;
++t;
if(t==50) {cout<<endl;t=0;}
}
if(t==0) cout<<endl;
else cout<<endl<<endl;
}
return 0;
}
没有释放内存,请勿效仿!