扑克牌的游戏

扑克牌的游戏

         手中有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;
}

原文地址:https://www.cnblogs.com/unixfy/p/3285368.html