注册 登录
编程论坛 C++教室

关于扑克牌移动问题

a99875984 发布于 2013-03-08 22:09, 709 次点击
问题:小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:
    他手里握着一叠扑克牌:A,2,....J,Q,K 一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。
    只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;......如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。
    这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K
    请你计算一下,小明最开始的时候手里牌的顺序是怎样的。
    把结果写出来,逗号分割,小明“魔术”开始时,最下面的那张牌输出为第一个数据。
    考场不提供扑克牌,你只能用计算机模拟了,撕碎草稿纸模拟扑克属于作弊行为!另外,你有没有把录像倒着放过?很有趣的!回去试试!
请问下对这题的思路是什么啊?这些移来移去的我才碰到两次,更不不知道该怎么用代码来实现。麻烦给个思路哈,谢谢了
7 回复
#2
azzbcc2013-03-09 00:30
哇,作业贴诶
#3
rjsp2013-03-09 09:07
程序代码:
#include <iostream>
#include <list>
#include <utility>
using namespace std;

int main()
{
    int cards[13];

    // 模拟翻牌动作
    {
        // 构建一堆牌
        list< pair<int,int> > buf;
        for( int i=0; i<13; ++i )
            buf.push_back( make_pair(i,-1) );

        for( int i=0; i<13; ++i )
        {
            // 从最下面拿一张放到最上面

            pair<int,int> t = buf.front();
            buf.pop_front();
            buf.push_back( t );
            // 再从最下面拿一张翻开放桌子上
            t = buf.front();
            buf.pop_front();
            // 应当为 A,2,3,4,5,6,7,8,9,10,J,Q,K
            cards[t.first] = i;
        }
    }

    // 输出结果
    for( int i=0; i<13; ++i )
    {
        printf( " %c", "A234567891JQK"[cards[i]] );
        if( cards[i] == 9 ) printf( "0" );
    }
   

    return 0;
}
输出是  7 A Q 2 8 3 J 4 9 5 K 6 10

如果倒着模拟这个过程,那更简单,最后一次是 K,则倒数第二次为 K Q,只有这样才能保证最下面的倒数第二张牌是Q。
Q也是从最下面移上来的,所以倒数第三次为Q J K,……
整个倒序过程是
K
K Q
Q J K
K 10 Q J
J 9 K 10 Q
Q 8 J 9 K 10
10 7 Q 8 J 9 K
K 6 10 7 Q 8 J 9
9 5 K 6 10 7 Q 8 J
J 4 9 5 K 6 10 7 Q 8
8 3 J 4 9 5 K 6 10 7 Q
Q 2 8 3 J 4 9 5 K 6 10 7
7 A Q 2 8 3 J 4 9 5 K 6 10
规律就是将第n行的首部加上下一张牌,然后把尾部的牌移到前面去。比如
K 前面加 Q 得到 Q K,然后将尾部的K移到最前面得到 K Q
K Q 前面加 J 得到 J K Q,然后将尾部的K移到最前面得到 Q J K
Q J K 前面加 10 得到 10 Q J K,然后将尾部的K移到最前面得到 K 10 Q J
……
这个算法就太简单了,不写代码了。

#4
锋了2013-03-09 16:09
加油。。。
#5
a998759842013-03-09 21:27
回复 2楼 azzbcc
这个真不是作业贴,蓝桥杯的一道题
#6
a998759842013-03-09 21:27
回复 4楼 锋了
谢了哈
#7
a998759842013-03-09 21:33
回复 3楼 rjsp
看到LIST,我就想哭了,大二下学期了,数据结构才刚开始学,语音就学了C++,数据库还要等下学期,也不知道学校给我们怎么安排的课程,到现在除了一些简单的程序,别的都写不出来
#8
a998759842013-03-09 22:02
回复 3楼 rjsp
虽然看不懂那个源代码,不过谢谢了哈啊,先留着,等我学了后我在回看下
1