挺有意思的一个题目,题目意思就不说了,查看了别人的代码都是用队列解决的,个人还是喜欢用原始的数组表示。
这题最主要的思路是运用逆向求解,将魔术的过程反过来然后就可以求出结果了,先输入一个N,然后将从1到N的数字由大到小给数组赋值,a[0]=N......然后就进行N轮的排序过程,具体见代码。
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.
Input specifications
On the first line of the input is a single positive integer, telling the number of test cases to follow. Each case consists of one line containing the integer n.
Output specifications
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 ...
Sample input
2 4 5
Output for sample input
2 1 4 3 3 1 4 5 2
#include<iostream>
#include<stdio.h>
using namespace std;
void f(int *a,int n){
int i,temp;
temp=a[0];
for(i=0;i<n-1;i++)
a[i]=a[i+1];
a[n-1]=temp;
}
int main(){
int n,a[14],m,b[14],k,j;
cin>>n;
while(n--){
cin>>m;
j=m;
for(int i=0;i<m;i++)
a[i]=m-i;
for(int i=1;i<=m;i++){
for(int h=0;h<m+1-i;h++)
f(a,i);
}
for(int i=j-1;i>0;i--)
printf("%d ",a[i]);
cout<<a[0];
cout<<endl;
}
return 0;
}