题目描述:
The magician shuffles a small pack of cards, holds it face down and performs the following procedure:
- The top card is moved to the bottom of the pack. The new top card is dealt face up onto the table. It is the Ace of Spades.
- Two cards are moved one at a time from the top to the bottom. The next card is dealt face up onto the table. It is the Two of Spades.
- Three cards are moved one at a time…
- This goes on until the nth and last card turns out to be the n of Spades.
This impressive trick works if the magician knows how to arrange the cards beforehand (and knows how to give a false shuffle). Your program has to determine the initial order of the cards for a given number of cards, 1 ≤ n ≤ 13.
输入描述:
<span style="color:#000000">On the first line of the input is a single positive integer k, telling the number of test cases to follow. 1 ≤ k ≤ 10 Each case consists of one line containing the integer n. 1 ≤ n ≤ 13</span>
输出描述:
<span style="color:#000000">For each test case, output a line with the correct permutation of the values 1 to n, space separated. The first number showing the top card of the pack, etc…</span>
样例输入:
复制
2
4
5
样例输出:
2 1 4 3
3 1 4 5 2
找规律就行,样例输入4
取牌的顺序为如下:
1退出之前将一张牌放到最后也就是2,
2退出之前将两张牌放到最后也就是4 3
3退出之前将三张牌放到最后也就是4 3 4
4退出时由于只剩这一张牌了所以直接退出就行
按照这个规律从退出n倒推到退出1
ac代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
int t,book[1005];
cin>>t;
while(t--){
fill(book,book+1005,0);
int n,l=0,r=2;
cin>>n;
book[0]=n;book[1]=n-1; //因为最后两个数肯定是n和n-1
for(int i=n-1;i>0;i--){
int j=i;
while(j--){ //循环j次
book[r++]=book[l++];
}
if(i!=1)book[r++]=i-1; //循环之后加上退出的
}
for(int i=r-1;i>r-1-n;i--){
cout<<book[i]<<" ";
}
cout<<endl;
}
return 0;
}