背景:两个人每人发3张牌(各从一副牌中),每张牌包括花色(红桃(Heart)>黑桃(Spade)>方块(Diamond)>梅花(Club))和大小(从小到大依次是:2-10、J、Q、K、A),谁手上有最大的一张或多张(如果有相同的牌)牌谁获胜。
输入:A的3张牌(未排序)和B的3张牌(未排序)。(参见用例)
输出:A的3张牌的排序后的输出和B的3张牌的排序后的输出,以及A和B谁获胜。(参见用例)
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
测试用例 4 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
测试用例 5 | 以文本方式显示
| 以文本方式显示
| 无限制 | 64M | 0 |
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct brand{
char name;
char value[3];
struct brand* next;
}brand;
typedef brand* Pbrand;
void in_list(Pbrand p,char name,char value[]){
Pbrand p1,p2;
p2=p;
p1=(Pbrand)malloc(sizeof(brand));
p1->next=NULL;
while (p2->next!=NULL){
p2=p2->next;//判断是否到尾节点
}
p2->next=p1;
p2->name=name;
strcpy(p2->value,value);
}
int change_name(char x){//该函数目的是将花色映射为可比较大小的数字
char name[4]={'C','D','S','H'};
for (int i=0;i<4;i++){
if (x==name[i]){
return i;
}
}
return -1;//代表输入错误
}
int change_value(char array[]){//将牌的大小映射为数字比较大小
char value[13][3]={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
for (int i=0;i<13;i++){
if (strcmp(value[i],array)==0){
return i;
}
}
return -1;//输入错误
}
void compare(Pbrand head,int* count){//将链表进行冒泡排序 ,count用来判断是否存在Input Error
Pbrand Head=head;
Pbrand End=NULL;
while (Head!=End){
while (Head->next!=End){
if (change_name(Head->name)==-1||change_name(Head->next->name)==-1){
(*count)++;
break;
}
if (change_name(Head->name)<change_name(Head->next->name)){
char temp=Head->name;
Head->name=Head->next->name;
Head->next->name=temp;
char array[3];strcpy(array,Head->value);
strcpy(Head->value,Head->next->value);
strcpy(Head->next->value,array);
}else if(change_name(Head->name)==change_name(Head->next->name)){
if (change_value(Head->value)==-1||change_value(Head->next->value)==-1){
(*count)++;
break;
}
if (change_value(Head->value)<change_value(Head->next->value)){
char array[3];strcpy(array,Head->value);
strcpy(Head->value,Head->next->value);
strcpy(Head->next->value,array);
}else if(change_value(Head->value)==change_value(Head->next->value)){
(*count)++;//一个人只有一副牌,不可能出现花色和大小都一样的牌
}
}
Head=Head->next;
}
End=Head;
Head=head;
}
}
int main(){
Pbrand head;Pbrand head1;
head=(Pbrand)malloc(sizeof(brand));
head1=(Pbrand)malloc(sizeof(brand));//分配内存 ,对头节点初始化
Pbrand headH=head;Pbrand head1H=head1;
head->name='C';head->next=NULL;
head1->name='C';head1->next=NULL;//初始化成员
char array[20],array1[20];
gets(array);gets(array1);//将输入读取到数组
char name1[3]="\0\0",name2[3]="\0\0";char value1[3][3],value2[3][3];
for (int i=0;i<3;i++){
memset(value1[i],'\0',sizeof(value1[i]));
memset(value2[i],'\0',sizeof(value2[i]));
}
int c1=0,c2=0,c3=0,c4=0;
for (int i=0;i<10;i++){
//这种算法只适用于花色不存在input error的情况,因为它先找到正确的花色,通过判断花色后面字符来确定value
if (array[i]=='H'||array[i]=='S'||array[i]=='D'||array[i]=='C'){
name1[c1++]=array[i];
if (array[i+1]=='1'&&array[i+2]=='0'){
strcpy(value1[c3++],"10");//10不是字符类型
}else{
value1[c3++][0]=array[i+1];
}
}
if (array1[i]=='H'||array1[i]=='S'||array1[i]=='D'||array1[i]=='C'){
name2[c2++]=array1[i];
if (array1[i+1]=='1'){
strcpy(value2[c4++],"10");
}else{
value2[c4++][0]=array1[i+1];
}
}
}
for (int i=0;i<3;i++){
in_list(head,name1[i],value1[i]);
in_list(head1,name2[i],value2[i]);//构建链表并读取相应值
}
free(head->next->next->next->next);
free(head1->next->next->next->next);//链表中多构建了一个节点,将尾节点删除并释放内存
head->next->next->next=NULL;
head1->next->next->next=NULL;
int count=0;
compare(head,&count);compare(head1,&count);
if (count!=0){//count判断
printf("Input Error!\n");
}else{
int count1=0;//判断是否平局
for (int i=0;i<3;i++){
if (change_name(head->name)>change_name(head1->name)){
printf("Winner is A!\n");
break;
}else if(change_name(head->name)<change_name(head1->name)){
printf("Winner is B!\n");
break;
}else{
if (change_value(head->value)>change_value(head1->value)){
printf("Winner is A!\n");
break;
}else if(change_value(head->value)<change_value(head1->value)){
printf("Winner is B!\n");
break;
}else{
head=head->next;
head1=head1->next;
count1++;
}
}
}
if (count1==3){
printf("Winner is X!\n");
}
printf("A:");
for (int i=0;i<3;i++){
printf(" %c%s",headH->name,headH->value);
headH=headH->next;
}
printf("\n");
printf("B:");
for (int i=0;i<3;i++){
printf(" %c%s",head1H->name,head1H->value);
head1H=head1H->next;
}
printf("\n");
}
return 0;
}