PTA 纸牌排序

小诺诺喜欢玩纸牌比大小的游戏。现在有一副牌中的若干张纸牌,需要按牌面的数字从大到小的顺序排列,若数字大小相同则按花色从大到小(黑桃>红桃>梅花>方块)排列。牌面为A、J、Q、K分别用1、11、12、13表示;花色中的黑桃、红桃、梅花、方块分别用英文单词"spade"、"heart"、"club"、"diamond"表示。

输入格式:

测试数据有多组,首先输入测试的组数T (0<T<10),然后是T组测试数据;每组测试输入一行,按“花色 数字”的格式输入若干张牌,花色可能为"spade"、"heart"、"club"、"diamond"之一,数字为1~13。输入的数据之间可能有若干(至少1个)空格,在行的首尾也可能有若干空格,但每组输入数据的总长度不会超过1000个字符。

输出格式:

每组测试输出一行,按描述中的排序规则从大到小输出牌的信息,数据之间都以一个空格分隔。

输入样例:

2
 diamond 1 club 1  heart 1  spade 3 diamond 2 club 3 heart 2  
diamond 13 club 13 heart 13    spade 12

输出样例:

spade 3 club 3 heart 2 diamond 2 heart 1 club 1 diamond 1
heart 13 club 13 diamond 13 spade 12

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <stdio.h>
#include <string.h>
int main()
{
    int t,i,j;
    scanf("%d",&t);
    getchar();
    for(j=0; j<t; j++)
    {
        char c;
        int k=0,l,num;
        int t[200]= {0};//将花色和大小等信息联想打牌是牌的大小存入一个数组
        while(1)//while结束即完成输入
        {
            c=getchar();
            switch(c)
            {
            case 's' :
            {
                for(l=0; l<4; l++)
                    getchar();
                scanf("%d",&num);
                t[k]=(num-1)*4+4;//转换规律可从此处看出
                k++;
            }
            break;
            case 'h' :
            {
                for(l=0; l<4; l++)
                    getchar();
                scanf("%d",&num);
                t[k]=(num-1)*4+3;
                k++;
            }
            break;
            case 'c' :
            {
                for(l=0; l<3; l++)
                    getchar();
                scanf("%d",&num);
                t[k]=(num-1)*4+2;
                k++;
            }
            break;
            case 'd' :
            {
                for(l=0; l<6; l++)
                    getchar();
                scanf("%d",&num);
                t[k]=(num-1)*4+1;
                k++;
            }
            break;
            }
            if(c=='\n')//表示已经输入完成一行,下一行会在处理并输出这一行后进行输入
                break;
        }
        int q,w;
        for(q=0; t[q]!=0; q++)
            for(w=0; t[w]!=0; w++)
                if(t[w+1]>t[w])//降序排序
                {
                    int tp=t[w];
                    t[w]=t[w+1];
                    t[w+1]=tp;
                }
        for(i=0; t[i]!=0; i++)//排完序后进行转换输出即可
        {
            switch(t[i]%4)
            {
            case 1 :
            {
                printf("diamond ");
                num=((t[i]-1)/4)+1;
                printf("%d",num);
                break;
            }

            case 2 :
            {
                printf("club ");
                num=((t[i]-2)/4)+1;
                printf("%d",num);
                break;
            }
            case 3 :
            {
                printf("heart ");
                num=((t[i]-3)/4)+1;
                printf("%d",num);
                break;
            }
            case 0 :
            {
                printf("spade ");
                num=((t[i]-4)/4)+1;
                printf("%d",num);
                break;
            }
            }
            if(t[i+1]!=0)
                printf(" ");
        }
        printf("\n");
    }
    return 0;
}
/*大佬用的更加高级一点,本人学了但还未掌握
#include<stdio.h>//但是看完下面大佬的代码,我也有了点灵感,所以稍微借鉴了一点
#include<string.h>//把答案淦出来了
#define N 10//大佬blog链接https://blog.csdn.net/weixin_53295504/article/details/120120413
int main()
{
	struct poker
	{
		int num;
		int name;
	}data[N][1000],cha;
	int T,i,j,length[N],x,y,z,k;
	char c;	
	scanf("%d",&T);
	getchar();
	for(i=0;i<T;i++)
	{
		k=0;
		while(1)
		{
			c=getchar();
			switch(c)
			{
		    case 's' : {
				for(j=0;j<4;j++) 
					getchar();
				scanf("%d",&data[i][k].num);
				data[i][k].name=4;
				k++;
					   }break;
            case 'h' : {
			    for(j=0;j<4;j++)
					getchar();
				scanf("%d",&data[i][k].num);
			    data[i][k].name=3;
				k++;
				   }break;
			case 'c' : {
				for(j=0;j<3;j++)
					getchar();
				scanf("%d",&data[i][k].num);
				data[i][k].name=2;
				k++;
					   }break;
			case 'd' : {
				for(j=0;j<6;j++)
					getchar();
				scanf("%d",&data[i][k].num);
				data[i][k].name=1;
				k++;
					   }break;
            }
			if(c=='\n')
				break;
        }
		length[i]=k;
	}
	for(x=0;x<T;x++)
	{
		for(y=0;y<length[x]-1;y++)
		{
			for(z=0;z<length[x]-1-y;z++)
			{
				if(data[x][z].num<data[x][z+1].num)
				{
					cha=data[x][z];
					data[x][z]=data[x][z+1];
					data[x][z+1]=cha;
				}
				else
					if(data[x][z].num==data[x][z+1].num)
						if(data[x][z].name<data[x][z+1].name)
						{
							cha=data[x][z];
							data[x][z]=data[x][z+1];
							data[x][z+1]=cha;
						}
			}
		}
	}
    for(i=0;i<T;i++)
    {
        for(j=0;j<length[i];j++)
		{
			if(j)
				printf(" ");
			switch(data[i][j].name)
			{ 
            case 1 : printf("diamond ");break;
            case 2 : printf("club ");break;
            case 3 : printf("heart ");break;
            case 4 : printf("spade ");break;
			}
			printf("%d",data[i][j].num);
		}
		printf("\n");
	}
}
*/

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浮央乜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值