题解 | #洗牌#vector版
洗牌
https://www.nowcoder.com/practice/5a0a2c7e431e4fbbbb1ff32ac6e8dfa0
#define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<climits> using namespace std; int main() { int l = 0, n = 0, k = 0, t = 0; vector<int> d1, d2, d; cin >> l; for (int i = 1; i <= l; i++)//一共L组 { cin >> n >> k;//一手n张牌,洗k次 for (int j = 0; j < n; j++) { cin >> t; d1.push_back(t); } for (int j = 0; j < n; j++) { cin >> t; d2.push_back(t); } //成功分成左右手 //change()*k;开始洗牌 for (int a = 1; a <= k; a++) { for (int b = 0; b < n; b++) { d.push_back(d2[n - b - 1]); d.push_back(d1[n - b - 1]); } d1.clear(); d2.clear(); reverse(d.begin(), d.end()); //意外发现只要按题目说的尾插,再反转正好是洗一次牌 for (int j = 0; j < n; j++) { d1.push_back(d[j]); } for (int j = n; j < 2 * n; j++) { d2.push_back(d[j]); } //再拆分为左右手 if (a != k) { d.clear(); //不留记忆 } } //跳出洗牌,准备输出 for (auto c : d) { cout << c << " "; } cout << endl; d.clear(); d1.clear(); d2.clear(); //不要干扰第二组洗牌 } return 0; }