1348 新约瑟夫

来源:互联网 发布:windows 驱动路径 编辑:程序博客网 时间:2024/04/30 02:49
描述

约瑟夫最近不玩约瑟夫问题玩腻了……

他改了一下规则:有N个人围成一圈,从1号开始,报数,报1,2,1,2,1,2…一直报到第N个人,报到2的出列,剩下的人再从刚才最后一个报数的人开始报数(如果该人应该出列,则倒推到他前面第一个没有出列的人)1,2,3,1,2,3…报到2,3的人出列。然后继续,报数范围从开始的1,2报数,到后来得1,2,3…K报数,直到队伍中只有1个人。请问这个人的编号是多少?每轮每个人只报一次数,即如果该轮开始时人数不足K个人,则不必一定报数到K。

(要求:软件学院08级本周练习必须使用C风格链表,否则不记成绩)

输入

第一行包含一个整数T表示有T组数据。

每组数据包含一个整数N,表示有N个人。(N<=1000)

输出

对于每组数据按照题目描述要求输出最终剩余人的编号。

 

 

 

 

 

依然用链表来做

#include <iostream>using namespace std;typedef struct node {int data;struct node *next;}List;List* initial(int a){List* p,*q,*r=NULL;for (int i=1;i<=a;i++){p=new List;p->data=i;p->next=NULL;if (r==NULL)            r=p;else            q->next=p;q=p;}q->next=r;return r;}int main(){    int n;    cin>>n;    for (int i=0;i<n;i++)    {        int m;        cin>>m;        List *p=initial(m);        int j=1;           while (p->next!=p)        {List *r=p;List *q=p;do{for (int k=0;k<=j;k++){r=r->next;if (r==q)break;}p->next=r;if (r!=q) p=r;}while (r!=q);            j++;        }        cout<<p->data<<endl;    }    return 0;    }


 

原创粉丝点击