小诺诺喜欢玩纸牌比大小的游戏。现在有一副牌中的若干张纸牌,需要按牌面的数字从大到小的顺序排列,若数字大小相同则按花色从大到小(黑桃>红桃>梅花>方块)排列。牌面为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");
}
}
*/