问题描述:
        已知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;
}


posted on 2009-07-22 10:47  Forgetting  阅读(485)  评论(0)    收藏  举报