codeforces Badge B
阿新 • • 發佈:2018-11-15
題意
在一個叫資訊學校裡,老師會給犯了事的學生的徽章上打一個洞。有一天,有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; }