约瑟夫问题
Description
n个人想玩残酷的死亡游戏,游戏规则如下:
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。
请输出最后一个人的编号。
Input
输入n和m值。
Output
输出胜利者的编号。
Sample
Input
5 3
Output
4
Hint
第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node *next; } set; set *creat(set *tail,set *head) { set *p = (set *)malloc(sizeof(set)); p->next = head->next;//尾部结点和第一个结点连接 tail->next = p;//把前面的和新加入的连起来 return p; } //void Printf(set *head) //{ // set *p = head->next; // while(p) // { // if(p->next==NULL) // printf("%d\n",p->data); // else // printf("%d ",p->data); // p = p->next; // } //} int main() { int n,m; scanf("%d%d",&n,&m); int i = 0; set *head = (set*)malloc(sizeof(set)); head->next = head; set *tail = head->next; if(n==1) printf("1\n"); else { set *p,*q; for(i=1; i<=n; i++) { p = creat(tail,head); p->data = i; tail = p; } p = head; q = head->next; int count = 1; while(q->next!=q) { if(count%m==0) { p->next = q->next; q = q->next; count = 1; } else { p = p->next; q = q->next; count++; } } printf("%d\n",q->data); } return 0; }

浙公网安备 33010602011771号