三张牌比大小

三张牌比大小

由于两个同学学习了很久,想要打牌放松一下,但是他们两个眼睛有点花了,看不清牌的花色,只看得清牌的点数。所以他们改良了一了规则。
规则如下:
1.不分花色,只有牌的点数(2-10)
2.每个人三张牌,一共有4种牌型,按牌型大小排序如下:
(1)三同:三张牌点数相同,如6 6 6,8 8 8
(2)顺子:三张牌点数连续,如3 4 5,5 6 7
(3)对子:两张牌点数相同,另一张不同,如2 3 3,7 7 8
(4)单牌:三张牌点数都不同,且不连续,如2 3 5,9 4 7
3.牌型不同则牌型大的赢,否则按如下规则比较:
(1)三同:直接比较大小,如果相同则平局
(2)顺子:比较最大点数的大小,如果相同则平局
(3)对子:比较对子的大小,如果相同比较单牌的大小,如果都相同则平局
(4)单牌:先比较最大的牌,如果相同比较第二大的牌,如果相同则比较最小的牌,如果都相同则平局
你作为裁判需要判断谁是胜利者。

输入描述:

第一行输入一个整数t,代表有t组测试数据,
对于每组测试数据,
输入连续6个整数,a,b,c,d,e,f,其中a,b,c代表benTuTuT的牌,其中d,e,f代表XXL的牌
1<=t<=1000
2<=a,b,c,d,e,f<=10

输出描述:

对于每组测试数据,如果benTuTuT胜利则输出"benTuTuT win!",如果XXL胜利则输出"XXL win!",否则输出"No winner!"
并且对于每组数据,答案占单独的一行。
PS:请输出双引号内的所有内容,并且请勿输出双引号!

输入示例:

7
2 3 4 3 4 5
3 3 3 6 6 6
2 3 5 2 3 6
2 2 3 2 2 4
10 10 9 2 3 4
2 2 2 8 9 10
7 7 7 7 7 7

输出示例

XXL win!
XXL win!
XXL win!
XXL win!
XXL win!
benTuTuT win!
No winner!

遇到的问题:
1.比较的规则看起来很复杂,但归纳一下:

  • 牌型优先
  • 相同牌型从最大的一张比到最小的一张(牌型为对子时存在对子的数字小,单张的数字大的情况,就存在一二对子和二三对子两种情况,同牌型两种情况的比较,可以一三换位,保证对子都在二三)

因此可以用一个排序函数将牌从小到大理顺,
牌型最大的每张牌加上30,次大的加上20……
这样牌型大的就对牌型小的有绝对优势

2.三个整数比大小的简便方法:

if(a>b)t=a,a=b,b=c;
if(b>c)t=b,b=c,c=t;
if(a>b)t=a,a=b,b=c;

代码如下

#include<stdio.h>
int order(int a[])
{
	int t;
	
	if(a[0]>a[1])t=a[0],a[0]=a[1],a[1]=t;
	if(a[1]>a[2])t=a[1],a[1]=a[2],a[2]=t;
	if(a[0]>a[1])t=a[0],a[0]=a[1],a[1]=t;

	//根据牌型的大小,给不同的牌型加相应的10的倍数	
	if(a[0]==a[1]&&a[0]==a[2])		a[0]=a[0]+30, a[1]=a[1]+30, a[2]=a[2]+30;
	//对子在排好序后,有二三对子,一二对子
	//一二的情况,对子的数字小,但优先级高,所以变成二三对子 
	if(a[0]==a[1]&&a[0]!=a[2])		t=a[0]+10,    a[0]=a[2]+10, a[2]=t;
	if(a[1]==a[0]+1&&a[2]==a[1]+1)  a[0]=a[0]+20, a[1]=a[1]+20, a[2]=a[2]+20;		
}
int battle(int a[],int b[])
{
	int i;
	int count =0;
	//分出胜负则离开循环,a胜返回1,b胜返回-1,
	//若循环走完仍未break,则返回初始值0,平局
	for(i=2;i>=0;i--)
	{
		if(a[i]>b[i])
		{
			count=1;
			break;
		}
		else if(a[i]<b[i])
		{
			count=-1;
			break;
		}		
	}
	return count;
}
int main()
{
	int n;
	scanf("%d",&n);
	//数组a,b为二人手牌,c为比较的结果 
	int a[3],b[3],c[n];
	int i,j;
	for(i=0;i<n;i++)
	{
		scanf("%d %d %d",&a[0],&a[1],&a[2]);
		scanf("%d %d %d",&b[0],&b[1],&b[2]);
		order(a);
		order(b);
		c[i]=battle(a,b);
	}
	for(i=0;i<n;i++)
	{
		if(c[i]==1)
		printf("benTuTuT win!\n");
		else if(c[i]==-1)
		printf("XXL win!\n");
		else
		printf("No winner!\n");
	}	
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值