約瑟夫環

約瑟夫環

Josephus有過的故事:39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓。於是決定了自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺。然後下一個重新報數,直到所有人都自殺身亡爲止。然而Josephus 和他的朋友並不想遵從,Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

分析
我們可以用一個隊列解決這個問題。首先,將1-41按順序放入隊列中。然後,從隊首開對報數,如果報數爲1和2,則出對後進隊,報數爲3的出對操作,直至隊列只剩下2個元素。

代碼塊

#define value 3
queue<int> Q;
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        int i;
        for(i=1;i<=n;i++){
            Q.push(i);
        }
        while(Q.size()>1){
            for(i=1;i<value;i++){
                Q.push(Q.front());
                Q.pop();
            }
            Q.pop();
        }
        while(!Q.empty()){
            printf("%d\n",Q.front());
            Q.pop();
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章