zoukankan      html  css  js  c++  java
  • 数据结构与算法--约瑟夫问题

    问题描述

    已知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);
    }
    
  • 相关阅读:
    lsof命令详解
    nmap命令详解
    ss命令详解
    netstat命令详解
    ifup,ifdown命令详解
    playbook部署nginx
    cento7忘记root密码怎么办
    正确关闭selinux
    使用ssh-agent管理私钥
    gitlab中的CI
  • 原文地址:https://www.cnblogs.com/CocoML/p/12726957.html
Copyright © 2011-2022 走看看