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; } }
(本博文或多或少参考过其他网上资料,但时间已久忘记当初的参考了,在此对他们表示感谢!)