很多年过去了,每当想起儿时跟表弟玩计算24的游戏时的情景,还会情不自禁地微微一笑。
游戏的规则很简单:一副扑克牌,乱序后每局抽出4张,计算牌面点数经四则运算是否能得到24。先计算出的人扼要说出计算方法,验证无误后获得本局比赛胜利,得到4张牌。全部牌用完后谁手中的牌多即获得最后的胜利!
有些题目很简单,如2,2,2,3,常常看到你争我抢的局面,而有的题目则不太容易算出,甚至可能误判为无解,如2,4,9,10……
现在,我们都学会了编程。为了在多年后再一争高下,我们决定进行一次新的比拼:看谁写出的程序能既快又准地算出结果!比赛的基本规则不变,即仍是每局4个整数,运用四则运算(可以加括号),但为了降低程序设计的难度,除法的结果只保留整数部分,即5/2=2。
怎么样,你是不是也想加入我们的比赛呢?看看谁能获得最后的胜利!
输入:
本题包含多个测例。
数据的第一行有一个整数N(0从第二行开始的N行,各包含4个不大于15的以空格分隔的非零整数。
输出:
对于每个测例,如果可以计算得到24,则输出“Yes”,否则输出“No”。每个输出占一行。
输入样例:
2
2 2 3 3
2 4 9 10
输出样例:
Yes
Yes
#include<cstdlib>
#include <iostream>
#include <string>
using namespace std;
int number[10];
bool PointGame(int n)
{
if (n == 1)
{
if (number[0]==24 )
return true;
else
return false;
}
//两个for循环获得初始的两个数(i=0:[((a,b),d),c];i=1:[((b,c),a),d];i=2:[(c,d),(a,b)])
for (int i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{
int a, b; //a保存上一步操作的结果,b保存这一次将要操作的数
a = number[i]; //保留上一步操作的结果(根据初始i的不同,a,b,number的功能需互换)
b = number[j]; //保留这一步操作的数
number[j] = number[n - 1]; //获取下一步要操作的数
number[i] = a + b; //存储操作的结果
if (PointGame(n - 1))
return true;
number[i] = a - b;
if (PointGame(n - 1))
return true;
number[i] = b - a;
if (PointGame(n - 1))
return true;
number[i] = a * b;
if (PointGame(n - 1))
return true;
if (b != 0)
{
number[i] = a / b;
if (PointGame(n - 1))
return true;
}
if (a != 0)
{
number[i] = b / a;
if (PointGame(n - 1))
return true;
}
number[i] = a;//恢复
number[j] = b;
}
}
return false;
}
int main()
{
int r;
cin >> r;
int m, n;
int a = 1;
int b =1;
while(r>0){
for (int i = 0; i < 4; i++)
cin >> number[i];
if (PointGame(4))
cout << "Yes" << endl;
else
cout << "No" << endl;
r--;
}
return 0;
}