不敢死隊問題

不敢死隊問題

Time Limit: 1000ms   Memory limit: 65536K  有疑問?點這裏^_^

題目描述

說到“敢死隊”,大家不要以爲我來介紹電影了,因爲數據結構裏真有這麼道程序設計題目,原題如下:

 

M個敢死隊員要炸掉敵人的一個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前一個戰士沒完成任務,則要再派一個戰士上去。現給每個戰士編一個號,大家圍坐成一圈,隨便從某一個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如果此戰士沒完成任務,再從下一個戰士開始數數,被數到第5時,此戰士接着去執行任務。以此類推,直到任務完成爲止。

 

這題本來就叫“敢死隊”。“誰都不想去”,就這一句我覺得這個問題也只能叫“不敢死隊問題”。今天大家就要完成這道不敢死隊問題。我們假設排長是1號,按照上面介紹,從一號開始數,數到5的那名戰士去執行任務,那麼排長是第幾個去執行任務的?

輸入

輸入包括多試數據,每行一個整數M0<=M<=10000)(敢死隊人數),若M==0,輸入結束,不做處理。

 

輸出

輸出一個整數n,代表排長是第n個去執行任務。

示例輸入

9
6
223
0

示例輸出

2
6
132
#include <stdio.h>
#include <stdlib.h>
struct node
{
    int data;
    struct node *next;
};
int main()
{
    int n,i,s;
    struct node *head,*tail,*p,*r;
    while(~scanf("%d",&n)&&n!=0)
    {
        s=1;
        head=(struct node*)malloc(sizeof(struct node));
        head->next=NULL;
        tail=head;
        for(i=1;i<=n;i++)
            {
                p=(struct node*)malloc(sizeof(struct node));
                p->data=i;
                p->next=NULL;
                tail->next=p;
                tail=p;
            }
        tail->next=head->next;
        for(i=0,p=head;;i++)
        {
            if((i+1)%5==0&&p->next->data==1)
            {
                printf("%d\n",s);
                break;
            }
            else if((i+1)%5==0)
            {
                r=p->next;
                p->next=r->next;
                free(r);
                s++;
                n--;
            }
            else
                p=p->next;
        }
        for(i=0;i<n;i++)
        {
            r=head->next;
            head->next=r->next;
            free(r);
        }
        free(head);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章