【队列】飞盘游戏

Description

杰克是美国某小镇有名的飞盘高手。他掷飞盘的时候有一个习惯,在一叠飞盘中,从第一个飞盘(即位于顶端的飞盘)开始,从上往下依次编号为1,2,...,N。当至少还有两个飞盘的时候,杰克通常会掷出一个飞盘,然后把新的第一个飞盘放到所有飞盘的最后。输入N,输出每次扔掉的飞盘,以及最后剩下的飞盘。

Input
第一行为一个整数T(0<T<20),表示测试用例个数。
以下T行每行包含一个整数N(0<N<40),为一个测试用例的飞碟数。
Output

为每个测试用例单独输出一行,该行中依次输出每次掷出的飞盘编号以及最后剩下飞盘,每个飞盘后跟着一个空格。

Sample Input
2
7
4
Sample Output
1 3 5 7 4 2 6
1 3 2 4

Problem Source: 课程上机练习题

解题思路:

用队列来模拟实际情况

实现代码:

#include<iostream>
#include<queue>
using std::cout;
using std::cin;
using std::endl;
using std::queue;

int main() {
    int T, n, tmp;
    queue<int> q;
    cin >> T;
    for (; T > 0; T--) {//T个测例 
        cin >> n;
        for (int i = 0; i < n; i++) {//初始化栈,依次编号 
            q.push(i + 1);
        }
        
        for (int i = 0; q.size() > 2; ) {
            cout << q.front() << " "; //扔出飞盘,出栈队 
            q.pop();
            q.push(q.front());        //下一个放到队尾 
            q.pop();
        }
        
        if (q.size() == 2) {         //只剩两个飞盘时,直接依次输出 
           cout << q.front() << " ";
           q.pop();
        }
        cout <<  q.front() << " ";
        q.pop();
        cout << endl; 
    }
}                                 

 (本博文或多或少参考过其他网上资料,但时间已久忘记当初的参考了,在此对他们表示感谢!)

越努力越幸运~
原文地址:https://www.cnblogs.com/zengyh-1900/p/4064182.html