1197约瑟夫问题

来源:互联网 发布:java aop记录日志 编辑:程序博客网 时间:2024/05/18 00:13

约瑟夫问题


Problem Description

n个人想玩残酷的死亡游戏,游戏规则如下:

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

请输出最后一个人的编号。

Input

输入n和m值。

Output

输出胜利者的编号。

Example Input

5 3

Example Output

4

Hint

第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀


代码

//约瑟夫问题,利用尾插法建立循环链表#include <stdio.h>#include <stdlib.h>typedef struct node{    int data;    struct node *next;}NODE;int main(){    NODE *L=(NODE*)malloc(sizeof(NODE)),*p,*s;    L->next=NULL;    int n,m,i;    scanf("%d%d",&n,&m);    p=L;    for(i=1;i<=n;i++)//尾插法建立循环链表    {        s=(NODE*)malloc(sizeof(NODE));        s->data=i;        p->next=s;        p=s;    }    p->next=L->next;//让最后一个链表的下一节点指向开头    p=L->next;    free(L);    while(p->next!=p)//开始模拟(判断条件要注意:因为最后肯定剩下一个人,所以最后一个数据的指针域还是它本身)    {        for(i=1;i<m-1;i++)//注意点k-1        {            p=p->next;        }        p->next=p->next->next;//数到m的人被杀,并将这一节点从链表中删除        p=p->next;    }    printf("%d\n",p->data);    return 0;}
原创粉丝点击