zoukankan      html  css  js  c++  java
  • 约瑟夫环问题之选猴王

    n只猴子围成一圈,顺时针方向从1到n编号。之后从1号开始沿着顺时针方向让猴子从1,2,3……,m依次报数,凡报到m的猴子都让其出圈,取消候选资格。然后不停的俺顺时针方向报数,让报到m的猴子出圈,最后剩下一个就是猴王。

    #include <stdio.h>
    #include <stdlib.h>
    
    struct mon
    {
        int num;
        struct mon * next;
    };
    
    struct mon * creat(int n);//创建循环链表
    int sel(struct mon *head,int m,int n);//n只猴子报数出局的控制函数
    
    int main()
    {
        int n,m;
        struct mon *head;
        scanf("%d %d",&n,&m);
        head=creat(n);
        printf("
    猴王是%d
    ",sel(head,m,n));
    
        return 0;
    }
    
    struct mon * creat(int n)
    {
        int i;
        struct mon *p,*tail,*head;
        p=(struct mon *)malloc(sizeof(struct mon));
        p->num=1;
        p->next=NULL;
        head=p;
        tail=p;
        for(i=2;i<=n;i++)
        {
            p=(struct mon *)malloc(sizeof(struct mon));
            p->num=i;
            tail->next=p;
            tail=p;
            p->next=NULL;
        }
        tail->next=head;    //最后一个节点的指针指向第一个节点
        return head;
    }
    int sel(struct mon *head,int m,int n)
    {
        int num=0;  //猴子报数的计数变量
        int count=0;    //统计出圈猴子数目的技术变量
        struct mon *p,*q;  //分别指向当前结点及其前驱节点的指针
        q=head;
        while(q->next!=head)
            q=q->next;
        printf("被删除的猴子的编号依次是:");
        while(count<n-1)
        {
            p=q->next;
            num++;
            if(num%m==0)    //找到一个被删的节点,完成删除、计数、输出
            {
                q->next=p->next;
                printf("%3d",p->num);
                count++;
            }
            else
                q=p;
        }
        return q->num;  //最后一个节点数据则为猴王
    }
    


  • 相关阅读:
    python 参数化之读取写入yaml文件
    python实现对列表进行模糊查询
    通过UI自动化获取登录cookie,进行接口自动化测试
    Node.js初学
    Jquery 滚动到指定容器的位置,一行解决
    代码神兽护体
    React井字棋改进需求实现
    工作流开发流程
    call、apply和bind的学习
    call、apply和bind的学习
  • 原文地址:https://www.cnblogs.com/liesun/p/7350338.html
Copyright © 2011-2022 走看看