程序代码:
#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
……
这个算法就太简单了,不写代码了。