题目
ProblemC
题目:简单的24点
输入为4个数字,a,b,c,d。若a#b#c#d,则称该数组满足24点,其中#可以为+、-、*、/任一个,若不能得到结果24,则称该数组不满足24点。(计算为实型)
输入:
第一行为测试组数t
接下来t行,每一行为四个整数a,b,c,d,测试是否满足24点
1<=a,b,c,d<10000(右区间忘了,反正四个数不为0)
输出
在每一行
若满足,输出YES
不满足,输出NO
思路
我想的有点复杂,因为没有测试用例,我把符号顺便也打出来了,检验一下
代码
#include <bits/stdc++.h>
using namespace std;
char cpt[4]={'+','-','*','/'}; //这题就是计算器的变体啊! 08-18年
vector<int>myvector; //存储数字,好在都是整数,没考虑0的情况
vector<char>cmp;//存储运算符
int arr[20];//存储单步运算数结果
int Computer(string str)
{
myvector.clear();
cmp.clear();
memset(arr,0,sizeof(arr));
string temp="";
for(int i=0;i<str.size();i++)
{
if(str[i]>='0'&&str[i]<='9') temp+=str[i];
else {
cmp.push_back(str[i]);
myvector.push_back(atoi(temp.c_str()));
temp="";
}
}
myvector.push_back(atoi(temp.c_str()));
// for(int i=0;i<cmp.size();i++)
// {
// cout<<cmp[i]<<" ";
// }
// cout<<endl;
arr[0]=myvector[0];
int k=0;
for(int i=0;i<3;i++)
{
if(cmp[i]=='+') arr[++k]=myvector[i+1];
if(cmp[i]=='-') arr[++k]=-(myvector[i+1]);
if(cmp[i]=='*') arr[k]=arr[k]*(myvector[i+1]);
if(cmp[i]=='/') arr[k]=arr[k]/(myvector[i+1]);
}
int answer=0;
for(int i=0;i<=k;i++)
{
answer+=arr[i];
// cout<<"answer=="<<answer<<endl;
}
return answer;
}
int main()
{
int T; cin>>T;
while(T--)
{
string a,b,c,d; cin>>a>>b>>c>>d;
string str="";
int answer=0;
int flag=0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
for(int k=0;k<4;k++)
{
str=a+cpt[i]+b+cpt[j]+c+cpt[k]+d;
answer=Computer(str);
if(answer==24)
{
for(int i=0;i<cmp.size();i++)
{
cout<<cmp[i]<<" ";
}
cout<<endl;
flag=1;
break;
}
str="";
}
if(flag) break;
}
if(flag) break;
}
if(flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}