C++洗牌

洗牌

链接:洗牌
来源:牛客网

洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆)。接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌。接着把牌合并起来就可以了。 例如有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。 现在给出一个原始牌组,请输出这副牌洗牌k次之后从上往下的序列。

这个题主要考对二维数组的应用

#include
#include
//洗牌
using namespace std;

vector<int> func(vector<int> a) {
 int ban = a.size() / 2;
 int* a1 = new int[ban];
 int* a2 = new int[ban];
 
 for (int i = 0; i < ban; i++) {
  a1[i] = a[i];
  a2[i] = a[i + ban];
 }
 
 for (int i = 0, j = 0; i < ban; i++, j++) {
  a[j] = a1[i];
  j++;
  a[j] = a2[i];
 }
 return a;
}

int main() {
 int h = 0;//有几组数据
 cin >> h;
 vector<vector<int>> a(h);//创建二维数组
 int i = 0;

while (i < h) {
  int n = 0;//每组2*n个数据
  int k = 0;//洗几遍
  cin >> n >> k;
  a[i].resize(2 * n);  //根据输入的n来确定每组数组的长度
  for (int j = 0; j < 2 * n; j++) {
   cin >> a[i][j];
  }
  int l = 0;
  while (l < k) {  //循环执行k次洗牌函数
   a[i] = func(a[i]);
   l++;
  }
  i++;
 }
 
 //打印结果,注意格式
 for (i = 0; i < h; i++) {
  for (int j = 0; j < a[i].size(); j++) {
   cout << a[i][j] << ' ';
  }
  cout << endl;
 }
 return 0;
}

你可能感兴趣的:(C++)