約瑟夫環
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;
}