您的位置:首页 > 其它

UVa 817 - According to Bartjens(暴力)

2015-02-08 04:46 288 查看
给出一串数字,加上+、-、*使得结果等于2000。

数字上限9个,直接进行暴力即可,感觉STL写起来快,居然还过了。

反正也挺简单的,就不想再用字符数组重写了,用字符数组应该会快好多。

#include<iostream>
#include<algorithm>
#include<string>
#include<set>
#include<vector>
#include<cctype>
#include<map>
using namespace std;
const string sign[]={"*","+","-",""};
set<string> ans;
map<char,int> dict;
bool cal(string s){//计算字符串表示的值。
int t=0,p=0,q=0;
vector<int> num,sg;
while(1){
int num0=0,sg0=0;
while(isdigit(s[p])) num0*=10,num0+=s[p++]-'0';
num.push_back(num0);
if(s[p]=='=') break;
sg0=dict[s[p++]];
sg.push_back(sg0);
++q;
}
for(int i=0;i<sg.size();++i){
if(sg[i]==1){
num[i+1]*=num[i];
num.erase(num.begin()+i);
sg.erase(sg.begin()+i);
--i;
}
}
t=num[0];
for(int i=0;i<sg.size();i++){
if(sg[i]==2) t+=num[i+1];
else t-=num[i+1];
}
return t==2000;
}
void dfs(string s,int pos,bool flag){
if(pos==s.size()-1){
if(cal(s)) ans.insert(s);
return;
}
for(int i=0;i<4;++i){
if(!flag&&i==3) continue;
string s0=s;
if(s[pos]!='0') dfs(s0.insert(pos,sign[i]),i==3?pos+1:pos+2,true);
else dfs(s0.insert(pos,sign[i]),i==3?pos+1:pos+2,i==3);
}
return;
}
int main(){
ios::sync_with_stdio(false);
int t=0;
string s;
dict['*']=1,dict['+']=2,dict['-']=3;
while(cin>>s){
ans.clear();
if(s[0]=='=') break;
dfs(s,1,s[0]!='0');
cout<<"Problem "<<++t<<endl;
if(!ans.size()||s=="2000=") cout<<"  IMPOSSIBLE"<<endl;//至少要加一个符号。
else for(set<string>::iterator it=ans.begin();it!=ans.end();++it)
cout<<"  "<<*it<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: