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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章