扑克牌的游戏
手中有13张扑克牌,分别是1、2、3、4、5、6、7、8、9、10、J、Q、K,这里我们相求一种顺序,使得:每次将牌盖住,将最上面的牌放在最下面,再将最上面的牌扔出,使得扔出去的牌的顺序依次为:1、2、3、4、5、6、7、8、9、10、J、Q、K。
我们首先给出程序的模拟操作,初始时的顺序依次为:1、2、3、4、5、6、7、8、9、10、J、Q、K。
从初始顺序到结果顺序的过程为:先把初始顺序中的第一个元素放到最下面,然后将之后初始顺序中第一个元素抽出来,放入到结果顺序中。在我们的模拟程序中,用vector保存初始顺序和结果顺序,首先检测初始顺序序列是否为空,如果不为空,则首先将vector中最前的元素放到最后面,然后将vector中最前的元素抽取出来放入到结果顺序中最后面。依次循环,直至初始顺序为空。
通过对操作的模拟,我们可以根据初始顺序序列得到结果顺序序列。
另一个问题是,如果知道结果顺序序列,如何得到初始顺序序列。其实,这是一个相逆的过程。具体如下,首先,我们将结果顺序序列中的最后一个元素取出来,并从结果顺序序列中去除,将该元素加入到顺序序列的顶端,然后将初始顺序序列中的最后一个元素调整到最前面的位置,依次循环,直至结果顺序序列为空,最终得到结果顺序序列对应的初始顺序序列。
初始顺序到结果顺序以及结果顺序到初始顺序的模拟程序如下:
#include <iostream> #include <vector> #include <string> using namespace std; void display(const vector<string>& src) { for (auto i = 0; i != src.size(); ++i) { cout << src[i] << ' '; } cout << endl; } // 从初始顺序到结果顺序 void play(const vector<string>& src, vector<string>& des) { des.clear(); vector<string> src_tmp(src); display(src_tmp); display(des); cout << endl; while (!src_tmp.empty()) { string tmp = *src_tmp.begin(); // 取初始顺序中的第一个元素 src_tmp.erase(src_tmp.begin()); // 将初始顺序中第一个元素删除 src_tmp.push_back(tmp); // 将原第一个元素放到最后面 tmp = *src_tmp.begin(); // 取修改后的第一个元素 src_tmp.erase(src_tmp.begin()); // 将修改后的第一个元素删除 des.push_back(tmp); // 将修改后的第一个元素添加到结果顺序的末尾 display(src_tmp); display(des); cout << endl; } } // 从结果顺序到初始顺序 void play_reverse(const vector<string>& des, vector<string>& src) { src.clear(); vector<string> des_tmp(des); display(des_tmp); display(src); cout << endl; while (!des_tmp.empty()) { string tmp = *(des_tmp.end() - 1); // 取结果顺序末尾的一个元素 des_tmp.erase(des_tmp.end() - 1); // 将结果顺序末尾元素删除 src.insert(src.begin(), tmp); // 将该元素添加到初始顺序开头 tmp = *(src.end() - 1); // 去初始顺序最后一个元素 src.erase(src.end() - 1); // 将初始顺序中最后一个元素删除 src.insert(src.begin(), tmp); // 将该元素添加到初始顺序的最前头 display(des_tmp); display(src); cout << endl; } } int main() { //string strs[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; // string strs[] = {"2", "4", "6", "8", "10", "Q", "1", "5", "9", "K", "7", "3", "J"}; string strs[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17"}; vector<string> src(strs, strs + sizeof (strs) / sizeof (*strs)); vector<string> des; play(src, des); cout << endl; des.clear(); des.assign(strs, strs + sizeof (strs) / sizeof (*strs)); play_reverse(des, src); cout << endl; play(src, des); cout << endl; return 0; }