算法题-翻扑克
我手中有一堆扑克牌, 但是观众不知道它的顺序。
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); }