• 约瑟夫环问题之选猴王


    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;  //最后一个节点数据则为猴王
    }
    


  • 相关阅读:
    UVa10036
    矩阵链乘法(动态规划)
    Codeforces 230A
    iOS 界面开发
    iOS 自动布局
    iOS 自动布局过程
    iOS 界面布局,设置约束
    iOS + UIWebView 实践
    iOS 参考 网络书籍
    iOS 框架 Nimbus
  • 原文地址:https://www.cnblogs.com/liesun/p/7350338.html
Copyright © 2020-2023  润新知