• 【c语言】数据结构(约瑟夫生者死者游戏的问题)


    约瑟夫生者死者游戏:30个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分;因此船长告诉大家,只有将全船一半的旅客投入海中,其余人才能幸免遇难。无奈,大家只得同意这种办法,并议定30个人围成一圈,由第一个人开始,依次报数,数到第9个人,就把他投入大海中,然后从他的下一个人开始从1数起,数到第9个人,再将她投入大海,如此循环,直到剩下15个人乘客为止。问哪些位置是将被扔到大海的位置。

    解法有许多种,可以用数组,应为涉及到删除操作,数组(顺序线性表)比较麻烦,但不必要删除,只需要给跳船的人(元素),赋一个值来区分就好了。

    当然也可以用循环链表来做,如下;

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 struct DuLNOde{
     4 
     5     int date;
     6     struct DuLNOde * next;
     7 };
     8 int main()
     9 {
    10     struct DuLNOde *q=NULL;
    11     struct DuLNOde *p=NULL;
    12     struct DuLNOde *z=NULL;
    13     q=(struct DuLNOde*)malloc(sizeof(struct DuLNOde));
    14     if(!q)
    15         exit(0);
    16     p=q;
    17     p->date=1;
    18     p->next=p;
    19     for(int i=2;i<=30;i++)
    20     {
    21         z=(struct DuLNOde*)malloc(sizeof(struct DuLNOde));
    22         if(!z)
    23             exit(0);
    24         z->date=i;
    25         z->next=p->next;
    26         p->next=z;
    27         p=p->next;
    28     }
    29     p=q;
    30     for(int i=0;i<15;i++)
    31     {
    32         for(int j=1;j<8;j++)
    33            p=p->next;
    34         printf("%d
    ",p->next->date);
    35         p->next=p->next->next;
    36         p=p->next;
    37 
    38     }
    39 }

    输出结果如下:

    9
    18
    27
    6
    16
    26
    7
    19
    30
    12
    24
    8
    22
    5
    23
    

      

  • 相关阅读:
    Redmine入门-安装
    【Spring Cloud笔记】 Eureka通过集群实现高可用
    【SpringBoot笔记】SpringBoot整合Druid数据连接池
    【Spring Cloud笔记】 断路器-hystrix
    【Spring Cloud笔记】Eureka注册中心增加权限认证
    Jenkins实现简单的CI功能
    【SpringBoot笔记】SpringBoot如何正确关闭应用
    Activi相关表归纳
    阿里云MySQL远程连接不上问题
    Storm入门-Storm与Spark对比
  • 原文地址:https://www.cnblogs.com/duolaAbao/p/6648619.html
Copyright © 2020-2023  润新知