[蓝桥杯2012高职C试题]巧排扑克牌

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

    他手里握着一叠扑克牌: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;
}



  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值