问题 D: 数据结构基础15-魔法师和扑克游戏

题目描述

魔法师在玩一种扑克牌游戏,n张扑克分别记上1,2,……,n他打开第一张是1,把它放在一边。然后把最上面的两张一张一张地依次移到最后,打开上面一张刚好是2,再放在一边;然后把上面的3张一张一张移到最后,打开上面一张刚好是3,再放到一边;……如此重复下去,直到打开最后一张是n,放在一边;这时他发现,放在一边的扑克刚好是1,2,……,n这样排列的。请编程输出这些扑克原来是怎么排列的。

输入

一行一个正整数n

输出

一行n个正整数,表示这些扑克牌原来的排列顺序,每两个数之间有一个空格。

样例输入 Copy
【输入样例1】
5
【输入样例2】
9
样例输出 Copy
【输出样例1】
1 4 5 2 3
【输出样例2】
1 8 6 2 9 4 5 3 7
提示

数据范围:
70%的数据:n<=100;
30%的数据:n<=10000

我稍微给大家来点注释吧,这样的写法确实能比你单独的用链表啥的 做代码复杂度降低了很多的,主要是for循环那块,这样写主要出发点就是从末尾元素开始,假设你的所有元素已经出队完成,从最后一个出队的元素开始,在慢慢的向前推进,q.size()是指你在出这个元素之前的队里有多少元素,那么你就需要移动队里的元素多少次,因为你移动的次数由当前数的大小来决定,那么当x循环到1的时候你是不需要在循环一次,所以前面加了代码当x=1时直接跳出循环,由于他是逆序进入的,所以最后输出的时候也应该逆序输出。

#include<iostream>
#include<queue>
using namespace std;
queue<int> q;
int a[10000];
int main()
{
	int n;
	cin >> n;
	int x = n;
	for (int i = n; i >= 1; i--)
	{
		q.push(x);
		if (x == 1)
		{
			break;
		}
		for (int j = x % q.size(); j >= 1; j--)
		{
			q.push(q.front());
			q.pop();
		}
		x--;
	}
	int i = 1;
	while (!q.empty())
	{
		a[i] = q.front();
		q.pop();
		i++;
	}
	for (int i = n; i > 1; i--)
	{
		cout << a[i] << " ";
	}
	cout << a[1] << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值