题目来源:湘潭大学OJ-1248
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<iostream>
#include<algorithm>
#include<string>
using namespace std;
int ct(int* a)
{
if (*(a) == *(a + 1) == *(a + 2))
return 3;
else if (*(a) == *(a + 1) || *(a) == *(a + 2) || *(a + 1) == *(a + 2))
return 2;
else
return 1;
}
string com(int* a, int* b)
{
if (*a == 1 && *b != 1)return "Alice";
else if (*b == 1 && *a != 1)return "Bob";
else if (*a > * b)return "Alice";
else if (*b > * a)return "Bob";
}
string ck(int* a, int* b)
{
string inst;
sort(a, a + 3);
sort(b, b + 3);
if(*(a+1)!=*(b+1))
inst=com((a + 1), (b + 1));
else if (*(a) != *(a + 1) && *(b) != *(a + 1))inst=com(a, b);
else if (*(a) != *(a + 1) && *(b + 2) != *(a + 1))inst=com(a, b + 2);
else if (*(a + 2) != *(a + 1) && *(b + 2) != *(a + 1))inst=com(a + 2, b + 2);
else if (*(a + 2) != *(a + 1) && *(b) != *(a + 1))inst=com(a + 2, b);
else inst="Draw";
return inst;
}
int main()
{
int a[3], b[3];
int k;
cin>>k;
while(k--){
for (int i = 0; i < 3; i++)
cin >> a[i];
for (int i = 0; i < 3; i++)
cin >> b[i];
int ca = ct(a);
int cb = ct(b);
if (ca ==2&& cb == 2 || ca ==3&& cb == 3)cout<<ck(a, b)<<endl;
else if (ca != cb)
{
if (ca > cb)cout << "Alice" << endl;
else cout << "Bob" << endl;
}
else if(ca==1&&cb==1)
{
int suma = *(a)+*(a + 1) + *(a + 2);
int sumb = *(b)+*(b + 1) + *(b + 2);
if (suma > sumb)cout << "Alice" << endl;
else if (suma < sumb)cout << "Bob" << endl;
else cout << "Draw" << endl;
}
}
return 0;
}
这道题我有几点注意可以和大家分享一下:
1.这里需要注意的是在主函数里面(ca ==2&& cb == 2 || ca ==3&& cb == 3)的这段代码,本来我像上面函数块一样是写成连等的,后来被编译器认定为bool值向int型的提升,所以改成这样了,
2.思路一定要明确,要打什么事先想好,不要在中途变来变去
下面是我的运行截图: