2018网研:简单的24点

题目

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值