zoukankan      html  css  js  c++  java
  • PTA 6-15 用单向循环链表实现猴子选大王 (20 分)

    一群猴子要选新猴王。新猴王的选择方法是:让n只候选猴子围成一圈,从某位置起顺序编号为1~n号。每只猴子预先设定一个数(或称定数),用最后一只猴子的定数d,从第一只猴子开始报数,报到d的猴子即退出圈子;当某只猴子退出时,就用它的定数决定它后面的第几只猴子将在下次退出。如此不断循环,最后剩下的一只猴子就选为猴王。请输出猴子退出圈子的次序以及当选的猴王编号。

    函数接口定义:

    int KingOfMonkey(int n,linklist *head);
    裁判测试程序样例:

     #include <stdio.h>
     #include <stdlib.h>
    typedef struct node        /*这个结构类型包括三个域 */
    {	int number;        /*猴子的编号*/
    	int mydata;        /* 猴子的定数 */
    	struct node *next; /* 指向下一只猴子的指针 */
    } linklist;
    linklist *CreateCircle( int n );
    linklist *DeleteNext(linklist *p);   /* 删除单循环链表的p所指的下一个结点 */
    
    /* 提示: 你所有的代码将由系统插入在此处 */
    
    int main()
    {
        linklist *head;
        int i,n;
        scanf("%d",&n); 
        head = CreateCircle(n); /*创建单向循环链表,返回最后一个结点的指针 */
        printf("The king is monkey[%d].
    ", KingOfMonkey(n,head));
        return 0;
    }
    /* 请在这里填写答案 */
    

    输入样例:

    在这里给出一组输入。例如:

    5
    3 2 1 4 3

    输出样例:

    在这里给出相应的输出。例如:

    Delete No:3
    Delete No:4
    Delete No:5
    Delete No:1
    The king is monkey[2].

    解题思路:

    (有点类似约瑟夫环)
    链表模拟...没啥好说的..

    代码实现:

    linklist *CreateCircle(int n)
    {
        linklist *head = NULL, *tail = NULL, *p;
        for (int i = 1; i <= n; i++)
        {
            p = (linklist *)malloc(sizeof(linklist));
            scanf("%d", &p->mydata);
            p->number = i;
            if (i == 1)
            {
                head = p;
                head->next = NULL;
                tail = head;
            }
            else
            {
                tail->next = p;
                tail = tail->next;
                tail->next = head;
            }
        }
        return tail;
    }
    int KingOfMonkey(int n, linklist *head)
    {
        int cnt = head->mydata - 1;
        while (head->number != head->next->number)
        {
            if (!cnt)
            {
                printf("Delete No:%d
    ", head->next->number);
                cnt = head->next->mydata - 1;
                head->next = head->next->next;
            }
            else
            {
                cnt--;
                head = head->next;
            }
        }
        return head->number;
    }
    
  • 相关阅读:
    “校园知网”5月11日冲刺计划书
    “校园知网”5月10日冲刺计划书
    “校园知网”5月9日冲刺计划书
    学习进度
    “校园知网”5月8日冲刺计划书
    “校园知网”5月7日冲刺计划书
    “校园知网”5月6日冲刺计划书
    “校园知网”5月5日冲刺计划书
    “校园知网”5月4日冲刺计划书
    04-课后作业2-动手动脑及String类整理
  • 原文地址:https://www.cnblogs.com/graytido/p/11047927.html
Copyright © 2011-2022 走看看