Alice and Bob
题目描述
Alice和Bob在玩骰子游戏,他们用三颗六面的骰子,游戏规则如下:
- 点数的优先级是1点最大,其次是6,5,4,3,2。
- 三个骰子点数相同,称为"豹子",豹子之间按点数优先级比较大小。
- 如果只有两个骰子点数相同,称为"对子",对子之间按点数优先级比较大小。
- 其他情况称为"点子",点子按点数和比较大小。
- 豹子比对子、点子大,对子比点子大,如果对子的点数优先级相同,就看剩余那个骰子的点数优先级。
现在给你Alice和Bob投掷骰子的情况,判断一下胜负情况。
输入
第一行输入一个整数K,表示游戏的次数。 以后每两行表示一个样例,第一行是Alice骰子的点数。第二行是Bob骰子的点数。
输出
如果是Alice赢,输出"Alice",如果是Bob赢,输出"Bob",否则输出"Draw"。
样例输入
3 1 1 1 6 6 6 2 1 2 4 5 4 4 5 6 6 5 4样例输出
Alice Bob Draw
这个题还是蛮复杂的, 最好分情况写,一点点的把所有情况都考虑到。
此外,这个题对于数字大小的判断比较特殊,可以提前写个判断大小的函数,要用的时候引用一下就可以了。
还有就是要细心一点,对于flag呀这种标记变量,自己一定不能忘掉不同的数代表什么意思!!
#include<bits/stdc++.h>
using namespace std;
int scan(int a[])//判断一个数组里有几个相同的数*1
{
if(a[0]==a[1]&&a[1]==a[2]) return 3;
else if(a[0]==a[1]||a[1]==a[2]||a[2]==a[0]) return 2;
else return 0;
}
int judge(int a,int b)//提前写好一个判断数字大小的函数*2
{
if(a==1||b==1)
{
if(a==1&&b==1) return 3;
else if(a==1) return 1;
else return 2;
}
else if(a>b) return 1;
else if(a<b) return 2;
else return 3;
}
int main()
{
int k;
scanf("%d",&k);
while(k--)
{
int a[3],b[3];
int i,j,co1,co2,m,n,sum1,sum2,flag;
for(i=0,sum1=0;i<3;i++)//输入
{
scanf("%d",&a[i]);
}
for(i=0,sum2=0;i<3;i++)
{
scanf("%d",&b[i]);
}
co1=scan(a);
co2=scan(b);
if(co1>co2) printf("Alice\n");
else if(co1<co2) printf("Bob\n");
else if(co1==co2)
{
if(co1==3) flag=judge(a[0],b[0]);//对子的比较,由于所有点数相同,只要选一个点数来比较就可以啦
else if(co1==2)
{
sort(a,a+3);
sort(b,b+3);
if(a[1]==b[1])//如果有两个数相同,排完序之后中间的数一定是相同的那个数。
{
int t1,t2;
if(a[1]==a[0]) t1=a[2];//找是哪个数不同。
else t1=a[0];
if(b[1]==b[0]) t2=b[2];
else t2=b[0];
flag=judge(t1,t2);
}
else//相同的数是不同的,比较相同数的大小
{
flag=judge(a[1],b[1]);
}
}
else if(co1==0)
{
sum1=a[0]+a[1]+a[2];
sum2=b[0]+b[1]+b[2];
if(sum1>sum2) flag=1;
else if(sum1<sum2) flag=2;
else if(sum1==sum2) flag=3;
}
if(flag==1) printf("Alice\n");
else if(flag==2) printf("Bob\n");
else if(flag==3) printf("Draw\n");
}
}
return 0;
}
这个 还是参考网上大佬的代码自己改了一下orz
总结 一下优点:
*1:这里判断有几个数相同的方法还是比较妙的,因为就三个数嘛,把所有的情况举出来就可以了,我一开始还卡在这里了,老是想很复杂的方法,做题做傻惹qwq
*2:判断大小这里的判断语句也很容易错,因为我一开始就是错在这里......一定要想好逻辑关系,不能漏也不能重复,最好是把最最特殊的情况写到最前面。
*3:对对子的判断也很妙,看起来也很容易懂,不像我自己写的代码......努力学习好的想法和风格!!!
其实这道题也蛮有意思的,这种掷骰子的问题也可以用编程的方法来解决,或许生活中的其他问题也可以呢?如果世界的万物都能用一行行代码来概括,那是真的很cool!所以在生活中也要用编程的思想来看一些问题呀,编程真的其乐无穷吔!