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); }
磕磕盼盼能自己写出来了orz