#P2138. 翻牌游戏2.填空题.v2
翻牌游戏2.填空题.v2
题目描述
有 张写有数据的牌, 从上到下放成一堆,每次从上面取一张输出,再从上面取一张放回这堆牌的下面。重复这个过程,直到取完,发现取出牌上的数字恰巧是 , , , ..., ,问原先 张牌上的数是什么?
输入格式
第一行 个正整数:,范围在[1,100]。
输出格式
一行, 个整数。
样例
4
1 3 2 4
解题思路
题目要求的是牌在最开始的状态(每张牌上的数字是什么),然后告诉了操作办法,也告诉你按照这个操作办法输出的数字是什么。
其中解题思路是“电影倒带”的思路,还有一种思路是基于排序的思路。
-
我们先对 n 张牌入队列(x 数组),入队列的时候顺带给每一张排写上 id 信息,id 就是顺序,id 小的就是放在上面的那张牌,所以,这一叠牌从上到下的 id 是 1,2,3,.... n
-
然后,我们按照题目说的操作办法来操作:输出队首那张牌(队首也扔掉,出列),然后再把新队首放到牌的下方。按照题目的意思,输出的那张牌上面的数字是什么是知道的:第一次输出的是 1, 第二次输出的是 2,第 3 次输出的是 3.....,所以,我们每到了输出的时候,就可以把那张牌上的数字填上了,并且,我们把这张牌复制到一个新的数组(y 数组)
-
步骤 2 应该是循环了 n 轮,也意味着把 n 张牌全部都挪到了 y 数组。这时候我们把 y 数组按照 id 排序,就能还原出扑克牌的初始状态了。
-
输出 y 数组每一张怕上的数字。
完善程序
#include<bits/stdc++.h>
using namespace std;
struct card{
int id,num; // id 是最开始的顺序,是牌上的数字,
}x[2001],y[2001]; // x 是原来的情况,y 是输出的情况
bool cmp(card i, card j){
return i.id<j.id;
}
int n,head,tail;
int main()
{
scanf("%d",&n);
// 初始化,把 n 张牌放入 x 队列,并对每张牌写上 id,用来在后面追溯一开始的顺序
for(int i=1;i<=n;i++){
x[tail++].id = i;
}
for(int i=1;i<=n;i++){
x[head].num = __填空(1)__; // 按照题意,队首那张牌上的数字是什么 ?
y[i] = __填空(2)__; // 把队首赋值到 y 数组,并且队首出队列
__填空(3)__; // 把最上面的牌放到底部
}
__填空(4)__;// 按照 id 还原之前的顺序
for(int i=1;i<=n;i++)
printf("%d ",__填空(5)__);
return 0;
}
填空(1):{{ input(1) }}
填空(2):{{ input(2) }}
填空(3):{{ input(3) }}
填空(4):{{ input(4) }}
填空(5):{{ input(5) }}