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 巧排扑克牌模拟的主要内容,如果未能解决你的问题,请参考以下文章