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

来源:互联网 发布:plsql怎么连接到数据库 编辑:程序博客网 时间:2024/05/21 12:01

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

    他手里握着一叠扑克牌: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(",");elseprintf("\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;         //给这张牌做翻过的标记,这张牌的序号是ifirst[i]=c++;   //第i张牌是Cif(c==14) break;}for(i=12;i>=0;i--)  //将牌翻过来输出if(first[i]==10) printf("10 ");elseprintf("%c ",card[first[i]]);return 0;}



0 0
原创粉丝点击