一开始有n个人,以此按顺序持有一个编号,报到m的数字的那个人会淘汰,下一个人要继续从1开始报数,那么最后总会剩下一个人为幸存者
这个问题的难点就是到后面的话,淘汰掉的人会越来越多,那怎么处理这些空缺呢,比如说编号为2,3,4的人都淘汰的话,此时编号为1的人喊1,那么编号为5的人要继续喊2,这个问题和我们编程里面的continue功能类似,所有我们可以用continue来解决,直接跳过淘汰的人,从而不让计数器相加
具体代码段如下:
#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct list{
int a;
struct list *next;
}list,*yue;//节点的结构体
int main()
{
yue head,p,r;//三个指针
int i,n,m,j,t;
cout<<"请输入玩这个死亡游戏的总人数:";
cin>>n;//游戏总人数
printf("已经为玩这个死亡游戏的人编好号,依次是从1到%d号",n);
cout<<endl;
cout<<"请输入喊数字几的人死:";
cin>>m;//喊到死的数字
cout<<"请输入最后剩余的幸存者个数:";
cin>>t;
head=new list;
head->next=NULL;
r=head;
for(i=0;i<n;i++)//为所有玩家编号
{
p=new list;
p->a=i+1;
p->next=NULL;
r->next=p;
r=p;
}
r->next=head->next;//连接循环链表
p=head;//p从head开始进入循环
for(i=0;i<n-t;i++)
{
for(j=0;j<m;)
{
p=p->next;
if(p->a==0)//如果这之间路过了已经死掉的人,则跳过
{
continue;
}
else
{
if(j==m-1)//到了死亡的序号
{
p->a=0;
}
j++;
}
}
}
head=head->next;//head指针遍历链表(寻找幸存者)
r->next=NULL;//循环链表断开,否则会进入死循环
cout<<"最后的幸存者的编号为:";
while(head!=NULL)//遍历链表操作(寻找幸存者)
{
if(head->a!=0)
{
cout<<head->a<<" ";
}
head=head->next;
}
}