题意:n张纸叠在一起,从左到右折叠k次,然后从上到下给没个面一次编上序号1,2,3…,将纸打开,以从上到下的顺序,依次输出从左到右的数。
思路:发现就是截取上半部分的数,倒转后放在左侧,进行k次得到。
学习的代码:https://www.cnblogs.com/stelayuri/p/13435346.html
注意:关于vector的使用;将数倒转的过程如何实现的。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
vector<int> v[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int tcase;
cin>>tcase;
while(tcase--){
int n,k,x,cur;
cin>>n>>k;
int N = n<<(k+1);//1左移k位,即2的k次方
for(int i = 1;i <=N;i++){
cin>>x;
v[i].clear();
v[i].push_back(x);
}
cur = 1;
for(int t=1;t<=k;t++){
int mid = (cur+N)>>1;
for(int i = cur;i<=mid;i++){
int siz = v[i].size();
for(int j = siz - 1;j>=0;j--)
v[mid+mid-i+1].push_back(v[i][j]);
}
cur = mid+1;
}
for(int i = N-n*2+1;i<=N;i++){
for(int j = v[i].size()-1;j>=0;j--){
if(j==0&&i==N){
cout<<v[i][j]<<endl;
}
else{
cout<<v[i][j]<<' ';
}
}
}
}
return 0;
}