1. 程式人生 > >例題4-3救濟金髮放

例題4-3救濟金髮放

n個人站成一圈,逆時針編號為1到n,有兩個官員,A從1開始逆時針發放,B從n開始順時針發放。在每一輪中,官員A數k個就停下來,官員B數m個就停下來了(有可能兩個官員停在同一個人身上)。接下來被官員選中的人離開隊伍。

本來逆時針順時針應該寫兩個go函式,但是發現可以合併通過取餘運算和新增1和-1。

這個問題最關鍵的問題就是確定移動的步長,並且在陣列中迴圈,當遇到被換成0的元素就繼續下一個。p=(p+d+n-1)%n+1;

程式碼如下:

#include<stdio.h>
#define maxn 25
int n,k,m,a[maxn];

int go(int p,int d,int t){

    while(t--){
        do{
            p=(p+d+n-1)%n+1;
        }while((a[p]==0));
    }

    return p;

}

int main(){
    while(scanf("%d%d%d",&n,&k,&m)==3&&n){
        for(int i=1;i<=n;i++) a[i]=i;
        int left = n;
        int p1 = n,p2 = 1;
        while(left){
            p1 = go(p1,1,k);
            p2 = go(p2,-1,m);
            printf("%3d",p1);
            left--;

            if(p2!=p1){
                printf("%3d",p2);
                left--;
            }

            a[p1]=a[p2]=0;
            if(left) printf(",");
        }
        printf("\n");

    }
    return 0;
}