洗牌在生活中十分常見,現(xiàn)在需要寫一個(gè)程序模擬洗牌的過程。 現(xiàn)在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張(上半堆),右手拿著第n+1張到第2n張(下半堆)。接著就開始洗牌的過程,先放下右手的最后一張牌,再放下左手的最后一張牌,接著放下右手的倒數(shù)第二張牌,再放下左手的倒數(shù)第二張牌,直到最后放下左手的第一張牌。接著把牌合并起來就可以了。 例如有6張牌,最開始牌的序列是1,2,3,4,5,6。首先分成兩組,左手拿著1,2,3;右手拿著4,5,6。在洗牌過程中按順序放下了6,3,5,2,4,1。把這六張牌再次合成一組牌之后,我們按照從上往下的順序看這組牌,就變成了序列1,4,2,5,3,6。 現(xiàn)在給出一個(gè)原始牌組,請(qǐng)輸出這副牌洗牌k次之后從上往下的序列。
輸入描述:
第一行一個(gè)數(shù)T(T ≤ 100),表示數(shù)據(jù)組數(shù)。對(duì)于每組數(shù)據(jù),第一行兩個(gè)數(shù)n,k(1 ≤ n,k ≤ 100),接下來一行有2n個(gè)數(shù)a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌組從上到下的序列。
輸出描述:
對(duì)于每組數(shù)據(jù),輸出一行,最終的序列。數(shù)字之間用空格隔開,不要在行末輸出多余的空格。
示例1
輸入
復(fù)制3 3 1 1 2 3 4 5 6 3 2 1 2 3 4 5 6 2 2 1 1 1 1
輸出
復(fù)制1 4 2 5 3 6 1 5 4 3 2 6 1 1 1 1
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> function1(vector<int>&a);
int main()
{
vector<int>a = {1,2,3,4,5,6};
int k=1;
vector<int>b = function1(a);
for (int i = 0; i < a.size(); i++)
{
cout << b[a.size() - 1 - i] << " ";
}
//cout << "a.size()" << a.size();
//cout << "count: " << count << endl;
system("pause");
}
vector<int> function1(vector<int>&a)
{
vector<int >b;
int A = a.size();
vector<int >l;
vector<int>r;
//cout << "有%d個(gè)數(shù)" << A << endl;
for (int i = 0; i < A / 2; i++)
{
l.push_back(a[i]);
r.push_back(a[i + A / 2]);
}
//cout << "r.size" << r.size();
for (int i = 0; i < A / 2; i++)
{
b.push_back(r[r.size() - 1 - i]);
//cout << a[i]<<" ";
b.push_back(l[l.size() - 1 - i]);
//cout << a[i + 1]<<" ";
}
for (int i = 0; i < a.size(); i++)
{
cout << b[i] << " " ;
}
cout<<endl;
//cout << "有%d個(gè)數(shù)" << a.size() << endl;
return b;
}