首页 > 代码库 > 【队列】飞盘游戏

【队列】飞盘游戏

Description

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

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

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

Sample Input
274
Sample Output
1 3 5 7 4 2 61 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;     }}                                 

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

【队列】飞盘游戏