1. 程式人生 > >codeforces Badge B

codeforces Badge B

題意

在一個叫資訊學校裡,老師會給犯了事的學生的徽章上打一個洞。有一天,有n個同學犯了事(1~n),老師首先詢問第一個同學,老師問到他們時他們都把賬賴在其他同學身上 但自己的徽章上也會打一個洞,然後老師再問被指控的學生(同樣徽章打洞和賴給其他人)如此詢問直到有同學的徽章打了兩個洞為止,輸出這個同學。再開始從第二個同學開始詢問,再從第三個......

結果就是輸出從第一個 到第 n 個同學開始詢問的打了兩個洞的學生。

思路

思路簡單,定義一個巨集陣列來模擬每個人徽章上洞的數量,初始為0。再定義一個數組來模擬學生賴的情況,下標是學生號,陣列值是所賴的學生號。故可以用for迴圈模擬老師首先詢問學生的場景,再利用函式遞迴來順次詢問,其中加上判斷條件和具體操作。(水水更健康啦!)

程式碼

#include<stdio.h>
#include<string.h>

int hole[1005]; // 打洞的情況
int a[1005];

int check(int n)
{
    for(int i=1;i<=n;i++)
    {
        if(hole[i]==2)
            return i;   // 看是否有人的徽章打了兩個洞
    }
    return 0;
}

int Find(int n,int m)
{
    hole[n]++;

    if(check(m)==0)
    {
        Find(a[n],m);      //函式遞迴 模擬詢問
    }
    else
        return check(m);
}

int main()
{
    int n;

    while(scanf("%d",&n)!=EOF)
    {

        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }

        for(int j=1;j<=n;j++)
        {
            int num;

            memset(hole,0,sizeof(hole)); //每次的首次詢問要初始化hole陣列
            num=Find(j,n);
            printf("%d",num);

            if(j!=n)
                printf(" ");
        }

        printf("\n");
    }
    return 0;
}