百丽宫乐学编程题:(BOSS)Poker time! (使用结构)

背景:两个人每人发3张牌(各从一副牌中),每张牌包括花色(红桃(Heart)>黑桃(Spade)>方块(Diamond)>梅花(Club))和大小(从小到大依次是:2-10、J、Q、K、A),谁手上有最大的一张或多张(如果有相同的牌)牌谁获胜。

输入:A的3张牌(未排序)和B的3张牌(未排序)。(参见用例)

输出:A的3张牌的排序后的输出和B的3张牌的排序后的输出,以及A和B谁获胜。(参见用例)

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. DA H2 C3↵
  2. H4 H3 DJ↵
以文本方式显示
  1. Winner is B!↵
  2. A: H2 DA C3↵
  3. B: H4 H3 DJ↵
无限制64M0
测试用例 3以文本方式显示
  1. HA CA CB↵
  2. HQ CJ CQ↵
以文本方式显示
  1. Input Error!↵
无限制64M0
测试用例 4以文本方式显示
  1. HA CA CJ↵
  2. DA DK DK↵
以文本方式显示
  1. Input Error!↵
无限制64M0
测试用例 5以文本方式显示
  1. SA SJ SK↵
  2. SA SJ SK↵
以文本方式显示
  1. Winner is X!↵
  2. A: SA SK SJ↵
  3. B: SA SK SJ↵
无限制64M0

#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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值