练习-圆桌问题

圆桌问题

学会链表的练手题:

题目描述

圆桌上围坐着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;
}

没有释放内存,请勿效仿!

posted @ 2020-11-29 01:27  七铭的魔法师  阅读(118)  评论(0编辑  收藏  举报