蓝桥杯 扑克牌“魔术

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


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


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


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


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


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

 

    考场不提供扑克牌,你只能用计算机模拟了,撕碎草稿纸模拟扑克属于作弊行为!另外,你有没有把录像倒着放过?很有趣的!回去试试!

 

正过程的第一步:从最底下拿一张牌到最上面。第二步:从最低下拿一张牌放到桌子上,

逆过程可以表示为,第一步:从桌子上拿一张牌到最底下。第二步,从最上面拿一张牌到最底下。

 

数组从左到右分别表示最上面和最下面,初始状态只有一个K(13),然后定义一个头指针f,尾指针r,分别指向牌顶和牌底的下一个,每次插入的时候,先把数值赋给牌底,牌底指针加1,然后把牌顶的牌放到牌底,牌顶指针加1,牌底指针再加1,可以想象,最后把1插进去的时候,f就是牌顶,而r仍然是牌底的下一个

 

 

#include<iostream>
using namespace std;

int main(){
	int a[100];
	int f,r;
	f=0,r=1;
	a[0]=13;
	for(int i=12;i>=1;i--){
		a[r++]=i;
		a[r++]=a[f++];
		
	}
	for(int i=r-1;i>=f;i--)
		cout<<a[i]<<' ';
	return 0;
}

 

----------------------------------------------------------------------------------------------------------------------

 

#include<iostream>  
using namespace std;  
  
int main()
{  
    int a[13];   
  
    int i,j=1,sign=0;  
  
    for(i=0;i<13;i++)    
        a[i]=-1;  
  
    for(i=0;j<=13;i++)  
    {  
        if(a[i%13]!=-1)  
            continue;  
        if(sign==0)  
        {  
            sign=1;continue;  
        }  
        if(sign==1)  
        {  
            a[i%13]=j;j++;sign=0;  
        }  
    }  
  
    for(i=12;i>=0;i--)  
        cout<<a[i]<<' ';  
    cout<<endl;  
    return 0;
}  

更新A,J,Q,K的输出

#include<iostream>
using namespace std;
 
int back(int n){
	if(n==1)
		return 65;	//A
	if(n==11)
		return 74;
	if(n==12)
		return 81;
	if(n==13)
		return 75;
	return n;
}
 
int main(){
	int a[100];
	int f,r;
	f=0,r=1;
	a[0]=13;
	for(int i=12;i>=1;i--){
		a[r++]=i;
		a[r++]=a[f++];
		
	}
	for(int i=r-1;i>=f;i--){ 
		int c=back(a[i]);
		if(c>11){
			cout<<(char)c<<' ';
		}else{
			cout<<c<<' ';
		}
	}
	cout<<endl;
	
	//第二种 
	int i,j=1,sign=0;  
  
    for(i=0;i<13;i++)    
        a[i]=-1;  
  
    for(i=0;j<=13;i++)  
    {  
        if(a[i%13]!=-1)  
            continue;  
        if(sign==0)  
        {  
            sign=1;continue;  
        }  
        if(sign==1)  
        {  
            a[i%13]=j;j++;sign=0;  
        }  
    }  
  
    for(i=0;i<=12;i++){
    	int c=back(a[i]);
		if(c>11){
			cout<<(char)c<<' ';
		}else{
			cout<<c<<' ';
		}
	}  
    cout<<endl;  
    
	return 0;
} 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌药ice

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值