圆桌问题
问题描述:
圆桌上围坐着2n个人。其中n个人是好人,另外n个人是坏人。如果从第一个人开始数数,数到第m个人,则立即处死该人;然后从被处死的人之后开始数数,再将数到的第m个人处死……依此方法不断处死围坐在圆桌上的人。试问预先应如何安排这些好人与坏人的座位,能使得在处死n个人之后,圆桌上围坐的剩余的n个人全是好人。
输入说明:
输入:好人和坏人的人数n(<=32767)、步长m(<=50);
输出说明:
输出2n个大写字母,‘G’表示好人,‘B’表示坏人。
输入范例:
52 6
输出范例:
BGGBGBGGBBBBGGGGBBBGBGGBGBBGGBBGBGBBGGGBBBGBGG BBGGBBGBBGGGGBBBBGGBGGBBGBBGGBGBBGGBBBGGBGGBBGGGBBGBGGGBGB
#include<iostream>
using namespace std;
struct ListNode{
char num;
int great;
struct ListNode *next;
};
ListNode *createByTail(int count){
ListNode *head=new ListNode;
ListNode *p,*p1;
p=head;
head->next=NULL;
int i=1;
count=count*2;
while(i<=count){
p1=new ListNode;
p1->great=0;
p1->num='G';
p->next=p1;
p=p1;
i++;
}
p->next=head;
return head;
}
void josephus(ListNode *head, int m,int n){//步长m,人数 n ,-1为坏人
int len=n;
ListNode *cur=head->next;
int count=1;
while(len>0){
if(count==m){
if(cur->great!=-1){
cur->great=-1;
count=1;
len--;
cur=cur->next;
}else{
cur=cur->next;
}
}else if(count<m){
if(cur->great!=-1){
cur=cur->next;
count++;
}else{
cur=cur->next;
}
}
if(cur==head){
cur=cur->next;
}
}
ListNode *p;
p=head->next;
int c=1;
while(p!=head){
if(p->great==-1){
p->num='B';
}
if(c==50){
cout<<p->num<<endl;
c=1;
}else{
cout<<p->num;
c++;
}
p=p->next;
}
}
int main(){
int count,len;
cin>>count>>len;
ListNode *head=createByTail(count);
josephus(head,len,count);
}