标题:关于扑克牌移动问题
只看楼主
a99875984
Rank: 2
等 级:论坛游民
帖 子:188
专家分:24
注 册:2012-2-11
结帖率:94.64%
已结贴  问题点数:20 回复次数:7 
关于扑克牌移动问题
问题:小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:
    他手里握着一叠扑克牌:A,2,....J,Q,K 一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。
    只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;......如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。
    这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K
    请你计算一下,小明最开始的时候手里牌的顺序是怎样的。
    把结果写出来,逗号分割,小明“魔术”开始时,最下面的那张牌输出为第一个数据。
    考场不提供扑克牌,你只能用计算机模拟了,撕碎草稿纸模拟扑克属于作弊行为!另外,你有没有把录像倒着放过?很有趣的!回去试试!
请问下对这题的思路是什么啊?这些移来移去的我才碰到两次,更不不知道该怎么用代码来实现。麻烦给个思路哈,谢谢了
搜索更多相关主题的帖子: 扑克牌 魔术 桌子 
2013-03-08 22:09
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:3 
哇,作业贴诶


[fly]存在即是合理[/fly]
2013-03-09 00:30
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:14 
程序代码:
#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
……
这个算法就太简单了,不写代码了。

2013-03-09 09:07
锋了
Rank: 7Rank: 7Rank: 7
来 自:向日葵幼儿园
等 级:黑侠
威 望:2
帖 子:306
专家分:586
注 册:2012-10-27
得分:3 
加油。。。
2013-03-09 16:09
a99875984
Rank: 2
等 级:论坛游民
帖 子:188
专家分:24
注 册:2012-2-11
得分:0 
回复 2楼 azzbcc
这个真不是作业贴,蓝桥杯的一道题
2013-03-09 21:27
a99875984
Rank: 2
等 级:论坛游民
帖 子:188
专家分:24
注 册:2012-2-11
得分:0 
回复 4楼 锋了
谢了哈
2013-03-09 21:27
a99875984
Rank: 2
等 级:论坛游民
帖 子:188
专家分:24
注 册:2012-2-11
得分:0 
回复 3楼 rjsp
看到LIST,我就想哭了,大二下学期了,数据结构才刚开始学,语音就学了C++,数据库还要等下学期,也不知道学校给我们怎么安排的课程,到现在除了一些简单的程序,别的都写不出来
2013-03-09 21:33
a99875984
Rank: 2
等 级:论坛游民
帖 子:188
专家分:24
注 册:2012-2-11
得分:0 
回复 3楼 rjsp
虽然看不懂那个源代码,不过谢谢了哈啊,先留着,等我学了后我在回看下
2013-03-09 22:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-400212-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.155703 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved