已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
顺序结构:
#include<iostream>
#include<vector>
using namespace std;
int man,password,nextpassword;
vector<int>a;
void Initarray()
{
cout<<"请输入参加游戏的人数:";
cin>>man;
cout<<"请输入第一个报号人的号数: ";
cin>>nextpassword;
//输入每个人的密码
for(int i=0;i<man;i++)
{
cout<<"请输入第"<<i+1<<"个人的密码";
cin>>password;
a.push_back(password);
}
}
void outorder()
{
int n=0,k=0;
while(1)
{
for(int j=0;j<nextpassword;)
{
if(a[n]!=0)
j++; //如果a[n]==0, 则循环次数不加1,即跳过a[n]这个人继续看下一个人的密码是否为0
n++; //继续下一个人,再判断a[n]是否等于0,无论是否为0,n都指向下一个人
if(n>=man)
n=n%man; //判断n的值是否超出参加游戏的人数,man为一开始定义参加游戏的人数
}//for循环结束
if(n==0)n=man; //如果n==0,说明出列的是就是最后一个人即man
nextpassword=a[n-1]; //将出列那个人的密码做为新的密码
a[n-1]=0; //将出列那个人的密码置为0
cout<<"第"<<n<<"被淘汰"<<endl ;
k++; //k为判断循环是否结束
if(k==man)break; //k为出列人数,如果k等于一开始参加的人数则说明问题已经解决
}
}
int main()
{
Initarray();
outorder();
return 0;
}
//6 2 1 8 4 5 2 3 >>2 5 1 3 6 4
//4 7 9 1 2 3 >>3 1 2 4
#include<iostream>
using namespace std;
typedef struct node //定义每个人结点
{
int password;
int num;
node *next;
}*Link;
typedef struct //定义循环链表
{
Link head;
}LinkList;
void InitList(LinkList &L)//初始化循环链表
{
int n;
Link p=L.head=new node;
cout<<"请输参加游戏人数:";
cin>>n;
for(int i=1;i<=n;i++)
{
p=p->next=new node;
p->num=i;
cout<<"请输入第"<<i<<"个人的密码:";
cin>>p->password;
}
p->next=L.head->next;//构成循环
}
void order(LinkList &L,int n)//计算出列顺序,并输出。n为密码
{
Link p=L.head->next;
Link q=p;
if(p==p->next)//说明只有一个结点,直接输出
{
cout<<p->num;
delete p;
cout<<endl;
}
else
{
for(int i=1;i<n;i++)
{
p=p->next;//指针前移
}
while(q->next!=p)//将指针q移至p的前一个结点,、
{
q=q->next;
}
q->next=p->next;//并将q的next指向p->next,确保在p被删除后还能构成循环
n=p->password; //将p的密码做为新的密码n
L.head->next=p->next;//将p之后的那个结点做为新的头结点
cout<<p->num<<" ";
delete p;
order(L,n);
}
}
int main()//主函数
{
LinkList L;
int t;
InitList(L);
cout<<"请输入初始密码:";
cin>>t;
order(L,t);
return 0;
}
浙公网安备 33010602011771号