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

posted @ 2015-03-12 14:00  Painting、时光  阅读(458)  评论(0编辑  收藏  举报