• 约瑟夫问题


    题目描述

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

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

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

    输入

    输入n和m值。

    输出

    输出胜利者的编号。

    示例输入

    5 3

    示例输出

    4

    提示

    第一轮:3被杀第二轮:1被杀第三轮:5被杀第四轮:2被杀
    数组解
    View Code
     1 #include<stdio.h>
     2 int main()
     3 {
     4     int a[100],i,m,n,next,num,rest;
     5     scanf("%d%d",&n,&m);
     6     for(i=1;i<=n;i++)
     7         a[i]=1;
     8     rest=n;
     9     num=1;
    10     next=1;
    11     while(rest>1)
    12     {
    13         if(a[num]==1)
    14             if(next==m)
    15             {
    16                 a[num]=0;
    17                 rest--;
    18                 next=1;
    19             }
    20             else
    21                 next++;
    22             if(num==n)
    23                 num=1;
    24             else
    25                 num++;
    26     }
    27     i=1;
    28     while((i<=n)&&(a[i]!=1))
    29         i++;
    30     printf("%d\n",i);
    31     return 0 ;
    32 }

    链表解

    View Code
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 struct node
     4 {
     5     int num ;
     6     struct node *next ;
     7 } ;
     8 struct node *creat(int n)
     9 {
    10     int i ;
    11     struct node *head, *p, *tail ;
    12     p = (struct node*)malloc(sizeof(struct node)) ;
    13     p -> num = 1 ;
    14     p -> next = NULL ;
    15     head = p ;
    16     tail = p ;
    17     for(i=2; i<=n; i++)
    18     {
    19         p = (struct node*)malloc(sizeof(struct node)) ;
    20         p -> num = i ;
    21         tail->next = p ;
    22         tail = p ;
    23         tail->next = NULL ;
    24 
    25     }
    26     tail->next = head ;
    27     return head ;
    28 }
    29 int del(struct node *head, int m, int n)
    30 {
    31     int count = 0, i = 0 ;
    32     struct node *p, *q ;
    33     q = head ;
    34     while(q->next!=head)
    35     {
    36         q = q -> next ;
    37     }
    38     while(count<n-1)
    39     {
    40         p = q ->next ;
    41         i++ ;
    42         if(i%m==0)
    43         {
    44             q->next = p->next ;
    45             free(p) ;
    46             count++ ;
    47         }
    48         else
    49         q = p ;
    50     }
    51     return q->num ;
    52 }
    53 int main()
    54 {
    55     int n, m, c ;
    56     struct node *head ;
    57     scanf("%d %d", &n, &m) ;
    58     head = creat(n) ;
    59     c = del(head, m, n) ;
    60     printf("%d\n", c) ;
    61     return 0 ;
    62 
    63 }
  • 相关阅读:
    java8 list 删除元素 简单版
    java8 list 删除元素 结构复杂版
    xshell 连接 centos 中的 vi 配色
    Redis 运行出错
    电脑清理秘籍 [ 精心总结 ]
    团队项目之后的反思
    团队项目心得 [ 感想 ]
    团队项目心得 [ 第二阶段项目总结 ]
    团队项目心得 [ 第一阶段项目总结 ]
    《创新者》读书笔记
  • 原文地址:https://www.cnblogs.com/yelan/p/2873921.html
Copyright © 2020-2023  润新知