“千里春风不识路,万仞山顶自相逢”
当当当!小橘归来,继续解题!
题目描述
背景:两个人每人发3张牌(各从一副牌中),每张牌包括花色(红桃(Heart)>黑桃(Spade)>方块(Diamond)>梅花(Club))和大小(从小到大依次是:2-10、J、Q、K、A),谁手上有最大的一张或多张(如果有相同的牌)牌谁获胜。
输入:A的3张牌(未排序)和B的3张牌(未排序)。(参见用例)
输出:A的3张牌的排序后的输出和B的3张牌的排序后的输出,以及A和B谁获胜。(参见用例)
解题思路
本题乍一看考排序,再定睛一看,哦,原来是有优先级的排序(花色和大小)。诶那感觉也不是很困难嘿嘿,结果真写起来就被啪啪打脸:)
经小橘不严谨的总结,认为本题的难点主要有三个,一是对于输入输出时的细节处理,二是对花色和大小的权重赋值处理,三是对'10'的单独处理
整体思路是先对牌的花色和大小分别进行赋值,然后想办法将这两个属性整合到一个数中用于比较,比较的过程中完成A、B的降序排序,最终输出结果。即:赋值——>整合——>比较——>输出。
关键参数
A[3][3],B[3][3]:3×3的二维数组,用于储存输入的三张牌,列为3是由于10的存在,得多留一位。
A_score[3][2],B_score[3][2]:对于每个花色和大小进行重新赋值,方便后续整合比较。花色的优先级高,故将其设为百位数。
A_sum[3],B_sum[3]:是对花色和大小整合后的数值,是比较和排序的依据。
难点分析
下面咱们对难点逐一进行分析:
1、输入输出时的细节处理
输入中只有10是特殊的,所以我们希望能将所有的输入都转变成两位的形式,这样方便后续的处理和比较。
注意:输入中无10,第三位为空格;若有10,则将第二位转变为'9'+1,第三位转变为0,并补上空格。
for(i=0;i<3;i++)
{
scanf("%c%c%c",&A[i][0],&A[i][1],&A[i][2]);
if(A[i][1]=='1'&&A[i][2]=='0')
{
A[i][1]='9'+1;
A[i][2]=0;
if(i!=2)
scanf(" ");
}
}
scanf("\n");
for(i=0;i<3;i++)
{
scanf("%c%c%c",&B[i][0],&B[i][1],&B[i][2]);
if(B[i][1]=='1'&&B[i][2]=='0')
{
B[i][1]='9'+1;
B[i][2]=0;
if(i!=2)
scanf(" ");
}
}
输出时要对第一步处理进行还原,将'9'+1还原为'10'
for(i=0;i<3;i++)
{
if(A[i][1]=='9'+1)
{
A[i][1]='1';
A[i][2]='0';
}
if(B[i][1]=='9'+1)
{
B[i][1]='1';
B[i][2]='0';
}
}
//输出结果
printf("A:");
for(i=0;i<3;i++)
{
if(A[i][2]=='0')
printf(" %c%c%c",A[i][0],A[i][1],A[i][2]);
else
printf(" %c%c",A[i][0],A[i][1]);
}
printf("\n");
printf("B:");
for(i=0;i<3;i++)
{
if(B[i][2]=='0')
printf(" %c%c%c",B[i][0],B[i][1],B[i][2]);
else
printf(" %c%c",B[i][0],B[i][1]);
}
printf("\n");
2、花色和大小的权重赋值处理
以A为例,对于花色和大小进行赋值。由于花色的优先级更高,故我们将花色权重设置到百位,这样对大小的赋值不会影响到花色。
A_sum,B_sum即代表整体的分数,后面可以直接拿这个作比较。
switch(A[i][0])
{
case 'H':
A_score[i][0]=400;
break;
case 'S':
A_score[i][0]=300;
break;
case 'D':
A_score[i][0]=200;
break;
case 'C':
A_score[i][0]=100;
break;
default:
printf("Input Error!\n");
return 0;
}
switch(A[i][1])
{
case '2':
A_score[i][1]=1;
break;
case '3':
A_score[i][1]=2;
break;
case '4':
A_score[i][1]=3;
break;
case '5':
A_score[i][1]=4;
break;
case '6':
A_score[i][1]=5;
break;
case '7':
A_score[i][1]=6;
break;
case '8':
A_score[i][1]=7;
break;
case '9':
A_score[i][1]=8;
break;
case '9'+1:
A_score[i][1]=9;
break;
case 'J':
A_score[i][1]=10;
break;
case 'Q':
A_score[i][1]=11;
break;
case 'K':
A_score[i][1]=12;
break;
case 'A':
A_score[i][1]=13;
break;
default:
printf("Input Error!\n");
return 0;
}
A_sum[i]=A_score[i][0]+A_score[i][1];
3、对'10'的单独处理
这个前面都已提到,一个是在输入时将数组由三位转换为两位,输出时在转变回来,另一个则是要注意运算时位数的统一。
完整代码
#include<stdio.h>
int main()
{
//本题的难点主要有三个,一是对于花色和大小的赋值处理,二是对花色和大小的权重处理,三是对'10'的单独处理
char A[3][3],B[3][3];
int A_score[3][2],B_score[3][2],A_sum[3],B_sum[3];
int i,j,temp;
char ctemp1,ctemp2;
//输入中只有10是特殊的,所以我们希望能将所有的输入都转变成两位的形式,这样方便后续的处理和比较
//注意:输入中无10,第三位为空格;若有10,则将第二位转变为'9'+1,第三位转变为0,并补上空格
for(i=0;i<3;i++)
{
scanf("%c%c%c",&A[i][0],&A[i][1],&A[i][2]);
if(A[i][1]=='1'&&A[i][2]=='0')
{
A[i][1]='9'+1;
A[i][2]=0;
if(i!=2)
scanf(" ");
}
}
scanf("\n");
for(i=0;i<3;i++)
{
scanf("%c%c%c",&B[i][0],&B[i][1],&B[i][2]);
if(B[i][1]=='1'&&B[i][2]=='0')
{
B[i][1]='9'+1;
B[i][2]=0;
if(i!=2)
scanf(" ");
}
}
//对于花色和大小进行赋值。由于花色的优先级更高,故我们将花色权重设置到百位,这样对大小的赋值不会影响到花色
//A_sum,B_sum即代表整体的分数,后面可以直接拿这个作比较
for(i=0;i<3;i++)
{
switch(A[i][0])
{
case 'H':
A_score[i][0]=400;
break;
case 'S':
A_score[i][0]=300;
break;
case 'D':
A_score[i][0]=200;
break;
case 'C':
A_score[i][0]=100;
break;
default:
printf("Input Error!\n");
return 0;
}
switch(A[i][1])
{
case '2':
A_score[i][1]=1;
break;
case '3':
A_score[i][1]=2;
break;
case '4':
A_score[i][1]=3;
break;
case '5':
A_score[i][1]=4;
break;
case '6':
A_score[i][1]=5;
break;
case '7':
A_score[i][1]=6;
break;
case '8':
A_score[i][1]=7;
break;
case '9':
A_score[i][1]=8;
break;
case '9'+1:
A_score[i][1]=9;
break;
case 'J':
A_score[i][1]=10;
break;
case 'Q':
A_score[i][1]=11;
break;
case 'K':
A_score[i][1]=12;
break;
case 'A':
A_score[i][1]=13;
break;
default:
printf("Input Error!\n");
return 0;
}
A_sum[i]=A_score[i][0]+A_score[i][1];
switch(B[i][0])
{
case 'H':
B_score[i][0]=400;
break;
case 'S':
B_score[i][0]=300;
break;
case 'D':
B_score[i][0]=200;
break;
case 'C':
B_score[i][0]=100;
break;
default:
printf("Input Error!\n");
return 0;
}
switch(B[i][1])
{
case '2':
B_score[i][1]=1;
break;
case '3':
B_score[i][1]=2;
break;
case '4':
B_score[i][1]=3;
break;
case '5':
B_score[i][1]=4;
break;
case '6':
B_score[i][1]=5;
break;
case '7':
B_score[i][1]=6;
break;
case '8':
B_score[i][1]=7;
break;
case '9':
B_score[i][1]=8;
break;
case '9'+1:
B_score[i][1]=9;
break;
case 'J':
B_score[i][1]=10;
break;
case 'Q':
B_score[i][1]=11;
break;
case 'K':
B_score[i][1]=12;
break;
case 'A':
B_score[i][1]=13;
break;
default:
printf("Input Error!\n");
return 0;
}
B_sum[i]=B_score[i][0]+B_score[i][1];
}
//有了前面的铺垫,这里就是一个简单的冒泡排序,需要关注的就是对于数字和字符的分离但同步的处理
for(i=0;i<2;i++)
{
if(A_sum[i]==A_sum[i+1]||B_sum[i]==B_sum[i+1])
{
printf("Input Error!\n");
return 0;
}
for(j=0;j<2-i;j++)
{
if(A_sum[j]<A_sum[j+1])
{
temp=A_sum[j];
A_sum[j]=A_sum[j+1];
A_sum[j+1]=temp;
ctemp1=A[j][0];
ctemp2=A[j][1];
A[j][0]=A[j+1][0];
A[j][1]=A[j+1][1];
A[j+1][0]=ctemp1;
A[j+1][1]=ctemp2;
}
if(B_sum[j]<B_sum[j+1])
{
temp=B_sum[j];
B_sum[j]=B_sum[j+1];
B_sum[j+1]=temp;
ctemp1=B[j][0];
ctemp2=B[j][1];
B[j][0]=B[j+1][0];
B[j][1]=B[j+1][1];
B[j+1][0]=ctemp1;
B[j+1][1]=ctemp2;
}
}
}
if(A_sum[0]==B_sum[0])
{
if(A_sum[1]==B_sum[1])
{
if(A_sum[2]==B_sum[2])
{
printf("Winner is X!\n");
}
else if(A_sum[2]>B_sum[2])
{
printf("Winner is A!\n");
}
else
{
printf("Winner is B!\n");
}
}
else if(A_sum[1]>B_sum[1])
{
printf("Winner is A!\n");
}
else
{
printf("Winner is B!\n");
}
}
else if(A_sum[0]>B_sum[0])
{
printf("Winner is A!\n");
}
else if(A_sum[0]<B_sum[0])
{
printf("Winner is B!\n");
}
//这一步也至关重要,是对第一步处理的还原,将'9'+1还原为'10'
for(i=0;i<3;i++)
{
if(A[i][1]=='9'+1)
{
A[i][1]='1';
A[i][2]='0';
}
if(B[i][1]=='9'+1)
{
B[i][1]='1';
B[i][2]='0';
}
}
//输出结果
printf("A:");
for(i=0;i<3;i++)
{
if(A[i][2]=='0')
printf(" %c%c%c",A[i][0],A[i][1],A[i][2]);
else
printf(" %c%c",A[i][0],A[i][1]);
}
printf("\n");
printf("B:");
for(i=0;i<3;i++)
{
if(B[i][2]=='0')
printf(" %c%c%c",B[i][0],B[i][1],B[i][2]);
else
printf(" %c%c",B[i][0],B[i][1]);
}
printf("\n");
return 0;
}
以上就是本次分享的全部内容啦,此题当然还有很多种解法,小橘也还在学习中,水平有限,如有考虑不周之处烦请各位不吝赐教:)