算法题-翻扑克

我手中有一堆扑克牌, 但是观众不知道它的顺序。

1、第一步, 我从牌顶拿出一张牌, 放到桌子上。

2、第二步, 我从牌顶再拿一张牌, 放在手上牌的底部。

3、第三步, 重复第一步、第二步的操作, 直到我手中所有的牌都放到了桌子上。

最后, 观众可以看到桌子上牌的顺序是:(牌底部)1,2,3,4,5,6,7,8,9,10,11,12,13(牌顶部)

请问, 我刚开始拿在手里的牌的顺序是什么?

 

解题思路:反向操作

1. 耐心的画出如果手上的牌是1,2,3,4,5,6,7的话,到桌子上是1,3,5,7,4,2,6的过程

2. 然后如果能构建逆向序列,则是正确的反操作

 

#include <list>
#include <iostream>
using namespace std;
/*
c.push_back(num)      在末尾增加一个元素。
c.pop_back()      删除末尾的元素。
c.push_front(num)      在开始位置增加一个元素。
c.pop_front()      删除第一个元素。
*/

void PrintList(list<int> a1)
{
    list<int>::iterator it;
    for(it = a1.begin();it!=a1.end();it++)
    {
         cout << *it << "\t";
    }
    return;
}

list<int> getOrigin(list<int>& desk)
{
    list<int> ret;
    if(desk.size() == 0)
        return ret;
    int tmp = desk.back();
    ret.push_front(tmp);
    desk.pop_back();

    if(ret.size() == 1)
    {
        tmp = desk.back();
        ret.push_front(tmp);
        desk.pop_back();
    }

    while(!desk.empty())
    {
        tmp = ret.back();
        ret.pop_back();
        ret.push_front(tmp);

        tmp = desk.back();
        ret.push_front(tmp);
        desk.pop_back();
    }
    return ret;
}

int main()
{
    //int arr[] = {1,3,5,7,4,2,6};
    int arr[] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
    list<int> desk;
    desk.assign(arr,arr+13);
    list<int> r = getOrigin(desk);
    PrintList(r);
}

 

posted @ 2020-09-02 17:21  0giant  阅读(493)  评论(0编辑  收藏  举报