题目内容
小明刚上小学,学会了第一个扑克牌“魔术”,到处给人表演。魔术的内容是这样的:
他手里握着一叠扑克牌:A,2,....J,Q,K 一共13张。他先自己精心设计它们的顺序,然后正面朝下拿着,开始表演。
只见他先从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是A;然后再从最下面拿一张放到最上面,再从最下面拿一张翻开放桌子上,是2;......如此循环直到手中只有一张牌,翻开放桌子上,刚好是K。
这时,桌上牌的顺序是:A,2,3,4,5,6,7,8,9,10,J,Q,K
请你计算一下,小明最开始的时候手里牌的顺序是怎样的。
把结果写出来,逗号分割,小明“魔术”开始时,最下面的那张牌输出为第一个数据。
考场不提供扑克牌,你只能用计算机模拟了,撕碎草稿纸模拟扑克属于作弊行为!另外,你有没有把录像倒着放过?很有趣的!回去试试!
对于大学生们蜂拥而上抢着参加的蓝桥杯我只能呵呵了,这个题真的是个恶心的模拟水题,实在搞不懂为什么湖师这么多老师+学生做不出来,用一个队列来模拟小明童鞋手中的扑克牌堆就行了,按着题目上说的做,把队首出队再踢进队尾,再出一次队首,一直这样循环直到队列空掉为止,就这么简单,我20min一遍AC
#include <stdio.h>
#include <queue>
using namespace std;
struct card
{
char num; //num=牌上标的数字
int id; //id=第id张牌
}member,first,second,in[13]; //队首=first,从前往后第二个牌=second,
queue <card> q;
char out[13]={'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
int main()
{
int i,j;
member.num=-1;
for(i=0;i<13;i++)
{
member.id=i;
q.push(member); //首先队列里推入13个-1,表示13个牌都是未知的
}
i=0,j=0;
while(!q.empty()) //所有牌没清完,就一直循环
{
first=q.front();
q.pop();
q.push(first); //队首弹出,压入队尾
second=q.front(); //弹出第二张牌
q.pop();
second.num=out[i++];
in[second.id]=second;
}
for(i=0;i<13;i++)
{
if(in[i].num=='T') printf("10");
else printf("%c",in[i].num);
if(i!=12)
printf(",");
else
printf("\n");
}
return 0;
}
下面是我爸做的,使用数组模拟队列,简化更多了,代码才20+行,我擦屌爆了,ORZ
#include<stdio.h>
int main()
{ int first[13],n[13]={0},i=0,c=1;
char card[15]=" A23456789TJQK";
while(1)
{
while(n[i]==1) //找出第一个到没有翻过的牌
i=(i+1)%13;
i=(i+1)%13; //跳过这张牌
while(n[i]==1) //继续找出下一个到没有翻过的牌
i=(i+1)%13;
n[i]=1; //给这张牌做翻过的标记,这张牌的序号是i
first[i]=c++; //第i张牌是C
if(c==14) break;
}
for(i=12;i>=0;i--) //将牌翻过来输出
if(first[i]==10) printf("10 ");
else
printf("%c ",card[first[i]]);
return 0;
}