约瑟夫问题——循环链表

    xiaoxiao2021-03-25  115

    think: 1顺序建立循环链表+循环链表中的符合题意的元素结点的删除 2注意只有一个人玩死亡游戏的情况

    sdut原题链接

    约瑟夫问题 Time Limit: 1000MS Memory Limit: 65536KB

    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被杀

    Author

    以下为accepted代码1

    #include <stdio.h> #include <stdlib.h> struct node { int Data; struct node *next; }*head, *tail; void Build(int n);//顺序建立循环链表 void Search_ans(struct node *h, int m);//循环链表中删除满足题意的元素结点 int main() { int n, m; while(scanf("%d %d", &n, &m) != EOF) { if(n == 1) printf("%d\n", n); else { head = (struct node *)malloc(sizeof(struct node)); head->Data = 1;//循环链表中头结点不再为空 head->next = NULL; tail = head; Build(n);//顺序建立循环链表 Search_ans(head, m);//循环链表中删除满足题意的元素结点 } } return 0; } void Build(int n)//顺序建立循环链表 { struct node *p; for(int i = 2; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); p->Data = i; p->next = tail->next; tail->next = p; tail = p; } p = (struct node *)malloc(sizeof(struct node)); p->Data = n; tail->next = p; p->next = head; } void Search_ans(struct node *h, int m)//在循环链表中删除满足题意的元素结点 { int cnt = 0; struct node *q, *p; q = tail->next; p = head; while(p->next != p) { cnt++; if(cnt % m == 0) { q->next = p->next; free(p); p = q->next; } else { q = p; p = p->next; } } printf("%d\n", p->Data); } /*************************************************** User name: Result: Accepted Take time: 0ms Take Memory: 108KB Submit time: 2017-03-10 21:04:59 ****************************************************/

    以下为accepted代码2

    #include <stdio.h> #include <stdlib.h> struct node { int Data; struct node *next; }*head, *tail; void Build(int n);//顺序建立循环链表 void Search_ans(struct node *h, int m);//循环链表中删除满足题意的元素结点 int main() { int n, m; while(scanf("%d %d", &n, &m) != EOF) { head = (struct node *)malloc(sizeof(struct node)); head->Data = 1;//循环链表中头结点不再为空 head->next = NULL; tail = head; Build(n);//顺序建立循环链表 Search_ans(head, m);//循环链表中删除满足题意的元素结点 } return 0; } void Build(int n)//顺序建立循环链表 { struct node *p; for(int i = 2; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); p->Data = i; p->next = tail->next; tail->next = p; tail = p; } if(n != 1) { p = (struct node *)malloc(sizeof(struct node)); p->Data = n; tail->next = p; p->next = head; } else { head->next = head; } } void Search_ans(struct node *h, int m)//在循环链表中删除满足题意的元素结点 { int cnt = 0; struct node *q, *p; q = tail->next; p = head; while(p->next != p) { cnt++; if(cnt % m == 0) { q->next = p->next; free(p); p = q->next; } else { q = p; p = p->next; } } printf("%d\n", p->Data); } /*************************************************** User name: Result: Accepted Take time: 0ms Take Memory: 108KB Submit time: 2017-03-10 21:06:48 ****************************************************/
    转载请注明原文地址: https://ju.6miu.com/read-24956.html

    最新回复(0)