josephus问题

Description

josephus问题其实就是一个游戏,一群小孩围成一个圈,设置一个数,这个数是个小于小孩总数大于0的一个整数,从第一个小孩开始报数,当其中一个小孩报到你设置的那个数的时候离开那个圈,这样一来反复报下去,直到只剩下最后一个小孩的时候那个小孩就是胜利者。现在的问题是设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。下面要解决的Josephus问题是:对于任意给定的n, s和m,求出这n个人的出局序列。请以n = 9, s = 1, m = 5为例,人工模拟Josephus的求解过程以求得问题的解。出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。本题可以对多个测试案例进行测试。

Input

第一行输入测试案例数T 以下T行,每一行是一个测试案例,分别输入n,s,m,以一个或多个空格隔开

Output

每个测试案例输出2行,第一行输出出局顺序第2行输出"** win.",其中**是胜利者编号,即最后出局者

Sample Input

1

9 1 5

Sample Output

5 1 7 4 3 6 9 2 8

8 win.

 

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<stdlib.h>

using namespace std;

typedef struct link{

    int num;

    struct link *next;

}IA;

IA *Create();

void *Delete(IA *head);

int n,m,s;

int main()

{

    IA *head = NULL,*tail = NULL;

    int T;

    scanf("%d",&T);

    while(T--){

        scanf("%d%d%d",&n,&s,&m);

        tail = Create();

        Delete(tail);

    }

    return 0;

}

IA *Create()

{

    IA *tail ,*head = NULL,*p;

    tail = head;

    int i = 1;

    while(i<=n){

            p = (IA*)malloc(sizeof(IA));

           p->num = i;

           if(head ==NULL){

              head  = p;

              tail = p;

              tail->next = NULL;

           }

           else {

                tail->next =p;

                p->next =NULL;

                tail = p;

           }

           i++;

    }

    tail->next = head;

    return tail;

}

void *Delete(IA *tail)

{

    IA * ptr1,*ptr2;

    int cnt = 0,hui = 0,i = 1;

    if(tail->next ==NULL) return 0;

      ptr1 = tail;

    ptr2 = tail->next;

    while(i!=s)

    {

        ptr1 = ptr2;

        ptr2 = ptr2->next;;

        i++;

    }

    while(hui!=n - 1){

        cnt++;

       if(cnt == m){

          printf("%d ",ptr2->num);

          ptr1 ->next =ptr2->next;

          free(ptr2);

          cnt = 0;

          hui++;

       }

       else ptr1 = ptr2;

       ptr2 = ptr1->next;

    }

   printf("%d\n%d win",ptr1->num,ptr1->num);

}
View Code

磕磕盼盼能自己写出来了orz

你可能感兴趣的:(OS)