>

约瑟夫问题

- 编辑:金沙国际平台登录 -

约瑟夫问题

1.率先,大家先来打探一下怎么样是Joseph环难点:

讲二个相比有意思的逸事:Joseph是犹太军事的三个将军,在抵御加拉加斯的起义中,他所指引的部队被打败,只剩余残留的队伍容貌40余名,他们都以坚强的人,所以不愿投降做叛徒。一堆人决定说要死,所以用意气风发种政策来前后相继杀死全体人。 
于是乎Joseph提出:每一回由别的四人齐声杀掉一位,而被杀的人的前后相继顺序是由抽签决定的,Joseph有机关地抽到了最后黄金年代签,在杀了除了她和多余那家伙之外的尾声一人,他劝性格很顽强在荆棘载途或巨大压力面前不屈了此外三个没死的人投降了亚特兰大。

 

通俗来讲正是:

依照如下法则去杀人:

  • 全数人围成生机勃勃圈
  • 顺时针报数,每一趟报到3的人将被杀掉
  • 被杀掉的人将从房间内被移走
  • 然后从被杀掉的下壹位重复报数,继续报3,再排除,直到剩下壹人

那么程序完成为:

  链表的定义: 定义为编号就可以 所以data项为int

  

typedef struct NODE{
    struct NODE *next;
    int data;
}Node,*Linklist;

 

出于是循环,直到最终一人, 全体能够运用非常的链表: 循环链表。 当链表中只剩余三个因素后,便感觉完事了。 即 L->next = L;

#include <stdio.h>
#include <stdlib.h>
#include "Linklist.h"

void Print_Linklist(Linklist L)
{
    Linklist head = L;
    printf("List: ");
    while(L->next != head)
    {
        printf("%d ",L->data);
        L = L->next;
    }
    printf("%d ",L->data);
    printf("n");
}

int main()
{
    int i;
    Linklist L;
    Linklist head;
    Linklist Out;
    L = (Node*)malloc(sizeof(Node));
    head = L;
    L->data = 1;
    L->next = head;
    for(i=2;i<=41;i++)
    {
        L->next=(Node*)malloc(sizeof(Node));
        L->next->data = i;
        L->next->next = head;
        L = L->next;
    }
    Print_Linklist(head);
    L = head;
    while(L != L->next)
    {
         for(i=1;i<2;i++)
         {
             L = L->next;
         }
         Out = L->next;
         printf("%2d号 ----> 自杀!n",Out->data);
         L ->next = Out->next;
         L = L->next;
         free(Out);
    }
    printf("幸存者是:%d",L->data);
    return 0;
}

图片 1

本文由办公软件发布,转载请注明来源:约瑟夫问题