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].\n", 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\n", head->next->number);
            cnt = head->next->mydata - 1;
            head->next = head->next->next;
        }
        else
        {
            cnt--;
            head = head->next;
        }
    }
    return head->number;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM