数据结构与算法--约瑟夫问题

时间:2020-04-18
本文章向大家介绍数据结构与算法--约瑟夫问题,主要包括数据结构与算法--约瑟夫问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题描述

已知n个人(以编号1,2,3,...,n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从k开始报数,数到m的那个人又出列;一词重复下去。直到圆桌的人全部出列。试用C++编程实现

核心步骤:

  • 建立一个具有n个链节点、无头节点的循环链表
  • 确定第一个报数人的位置
  • 不断地从链表中删除链节点,直到链表为空

编程实现

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define ERROR 0
typedef struct LNode
{
    int data;
    struct LNode *link;
}Lnode, *LinkList;

void JOSEPHUS(int n, int k, int m)
{
    // p为当前节点,r为辅助节点,指向p的前区节点,list为头节点
    LinkList p, r, list, curr;

    // 构建循环链表
    p = (LinkList)malloc(sizeof(LNode));
    p->data = 0;
    p->link = p;
    curr = p;
    for (int i = 1; i<n; i++)
    {
        LinkList t = (LinkList)malloc(sizeof(LNode));
        t->data = i;
        t->link = curr->link;
        curr->link = t;
        curr = t;
    }

    // 把当前指针移动到第一个报数的人
    while(k--) r=p, p=p->link;
    while(n--)
    {
        for (int s=m-1;s--;r=p, p=p->link);
        r->link = p->link;
        printf("%d->", p->data);
        free(p);
        p = r->link;
    }
}

main()
{
    JOSEPHUS(13, 4, 4);
}

原文地址:https://www.cnblogs.com/CocoML/p/12726957.html