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

p.s.自用

题目描述

魔法师在玩一种扑克牌游戏,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

答案
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

typedef struct queue {
	int* data;
	int front;
	int rear;
	int maxsize;
}arrQ;

arrQ init(int n)//初始化
{
	arrQ q;
	q.data = (int*)malloc(n * sizeof(int));
	q.front = q.rear = 0;
	q.maxsize = n;
	return q;
}
void enQueue(arrQ* q, int k)//入队
{
	if ((q->rear + 1) % q->maxsize == q->rear)//判满
		return;
	q->data[q->rear] = k;
	q->rear = (q->rear + 1) % q->maxsize;
}
int deQueue(arrQ* q)//出队
{
	if (q->rear != q->front)//判空
	{
		int k = q->data[q->front];
		q->front = (q->front + 1) % q->maxsize;
		return k;
	}
}

int main()
{
	int n;
	scanf("%d", &n);
	arrQ q = init(n);
	for (int i = n; i > 0; i--)
	{
		enQueue(&q, i);
		if (i == 1)
			break;
		for (int j = 0; j < i; j++)
		{
			int k = deQueue(&q);
			enQueue(&q, k);
		}
	}
	for (int i = n - 1; i >= 0; i--)
		printf("%d ", q.data[(i + q.front) % q.maxsize]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值