LQ0266 巧排扑克牌模拟

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0266 巧排扑克牌模拟相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2012初赛 C++ C组D题

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:

他手里握着一叠扑克牌:A,2,…J,Q,K 一共 13 张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。

只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是 A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是 2;…如此循环直到手中只有一张牌,翻开放桌子上,刚好是 K。

这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K。

请你计算一下,小明最开始的时候手里牌的顺序是怎样的。

把结果写出来,逗号分割,小明“魔术”开始时,最下面的那张牌输出为第一个数据。

问题分析
用模拟法来实现,用队列来模拟,再做一下逆计算。
题目BUG啊!逗号隔开,但是逗号后面需要有一个空格。

AC的C++语言程序如下:

/* LQ0266 巧排扑克牌 */

#include <iostream>
#include <queue>

using namespace std;

int cards[13 + 1];
char JQK[] = "JQK";

int main()

    queue<int> q, q2;
    for (int i = 1; i <= 13; i++)
        q.push(i);

    // 模拟
    while (q.size() > 1) 
        q.push(q.front());
        q.pop();
        q2.push(q.front());
        q.pop();
    
    q2.push(q.front());

    int k = 1;
    while (!q2.empty())
        cards[q2.front()] = k++;
        q2.pop();
    

    // 输出结果
    if (cards[1] == 1) printf("A");
    else if (cards[1] <= 10) printf("%d", cards[1]);
    else printf("%c", JQK[cards[1] - 11]);
    for (int i = 2; i <= 13; i++) 
        printf(", ");
        if (cards[i] == 1) printf("A");
        else if (cards[i] <= 10) printf("%d", cards[i]);
        else printf("%c", JQK[cards[i] - 11]);
    

    return 0;

以上是关于LQ0266 巧排扑克牌模拟的主要内容,如果未能解决你的问题,请参考以下文章

LQ0235 扑克牌移动程序填空

LQ0199 扑克序列枚举

LQ0013 牌型种数DFS

LQ0013 牌型种数DFS

LQ0137 双向排序模拟

LQ0224 翻硬币模拟